回答編集履歴

1 コメントを受けて追記

otn

otn score 45063

2018/05/29 09:39  投稿

そもそも認識が間違っています。そのファイル名はUTF-16ではなく、UTF-16を16進表現した文字列です。
Rubyで書いてみました。
```Ruby
Dir.glob("*#*").each do |file|
   newfile = file.scan(/#(....)|(.)/).map{|x,y| x ? [x].pack("H4").force_encoding("UTF-16BE").encode("UTF-8") : y}.join
   puts "rename #{file} to #{newfile}"
   #File.rename(file,newfile)
end
```
カレントディレクトリの`#`を含むファイルを処理します。UTF16では2バイト長の文字しかない前提。
リネーム処理自体はコメントにしてあるので、確認後アンコメントしてください。
リネーム処理自体はコメントにしてあるので、確認後アンコメントしてください。
#追記
高級言語を使わないと難しいですね。上のコードは、`#691c#8a3c`というようなファイル名だけでなく`#691c#8a3c.txt`のように16進表記以外の部分もあるかも知れない前提で書きましたが、それが無くて、`#691c#8a3c`というような16進表記部分しか無いのであれば、こんな感じで。
```Bash
for file in \#*
do x=$(echo "$file" | sed 's/#\(..\)\(..\)/\\x\1\\x\2/g')
  newfile=$(printf "$x" | iconv -f utf-16BE -t utf-8)
  echo rename "$file" to "$newfile"
  # mv "$file" "$newfile"
done
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る