一括してファイル名から見えない文字を削除する

一括してファイル名から見えない文字を削除する

私の外付けドライブにはおそらくたくさんコピーされ、ある時点で復元される可能性がある何百ものファイルがあります。ファイル名が寿命の間に奇妙な文字を取得したようで、それを修正する必要があります。

問題は、としてリストできますが、ls名前を参照して何もできないということです。

ls -l次の結果をレンダリングします。

-rwx------  1 krzysztof  staff  322451 Jun 27  2009 file015.jpg
-rwx------  1 krzysztof  staff  331337 Jun 27  2009 file016.jpg
-rwx------  1 krzysztof  staff  303078 Jun 27  2009 file017.jpg
-rwx------  1 krzysztof  staff  312346 Jun 27  2009 file018.jpg

ファイル自体は破損しておらず、名前を手動で変更すると問題がなくなります。まったく同じ名前のファイルを作成することもできます(両方のファイルが同時に表示されますls)。これにより、見えない文字に何か不審なことが起きていると信じることになり、これを実行して確認しました。find . -name '*[! -~]*'問題のすべてのファイルのリストが返されました。

通常、これらの名前は気にしませんが、一部のアプリやツールには明らかに問題があり、表示されないか無視されます。

たとえば、detox名前を変更するために最初に使用したツールがあります。名前が存在しないかのように偽装しただけです。

exiftool投げるNo such file or directory。同様にls -1、ループにパイピングするか、ファイル名をファイルに保存してパイピングすると、常にさまざまな形式が生成されますNo such file or directory。パイピングや保存時に見えない文字を保持しないようなものですか?

$ while read p; do
  mv "$p" "$p"
done <`find . -name '*.jpg'`
zsh: no such file or directory: ./file015.jpg

ファイル名をまとめて整理する方法はありますか?

編集1:

ls -v@terdonの要求に従って試しましたが、ls -B結果はありません。

しかし、それはls | head -n1 | od -cもっと面白かったし、自分自身の発見をすることができました。元の質問で名前が重要ではないと思っていましたが、そうしたので名前を変更したのでお詫び申し上げます。

これにより、以下はファイル014が手動で回復され、残りは破損した実際の出力です。

❯ ls -1
Zdjęcie014.jpg
Zdjęcie015.jpg
Zdjęcie016.jpg
Zdjęcie017.jpg
Zdjęcie018.jpg

これは - 私は最初のファイル名以上のものを表示ls | head -n2 | od -cした。n2

❯ ls | head -n2 | od -c
0000000    Z   d   j   e    ̨  **   c   i   e   0   1   4   .   j   p   g
0000020   \n   Z   d   j   e    ̨  **   c   i   e   0   1   5   .   j   p
0000040    g  \n
0000042

ここに画像の説明を入力してください。

ご覧のように、ę2つのファイルとls | head -n2 | od -c。手動で編集してファイル名を変更すると、014(固定ファイル)でカーソルを後ろに置き、ęバックスペースを押すと文字全体が消えます。他のファイルの場合は該当しません。バックスペースキーを押すとファイルがę変更されe、2番目のバックスペースキーを押すだけで削除されます。

@terdon ありがとうございます。今問題が何であるかを知りました。この問題を一括で解決するにはどうすればよいですか?

編集2:

014固定、015破損:

❯ ls | head -n2 | LC_ALL=C sed -n l
Zdje\314\250cie014.jpg$
Zdje\314\250cie015.jpg$

編集3:

コメントで提案したようにソリューションを適用してみました。macOSでアクセントにファイル名を変更するには?しかし、また会った。No such file or directory

❯ rename $'s/\u119/e/g' ./*
Can't rename './Zdjęcie015.jpg' to './Zdjecie015.jpg': No such file or directory

rename $'s/\u0328//g' ./*Bashとzshでは何もしません。

編集4:

❯ PERL_UNICODE=ASD find . -depth -execdir rename -n 's/\pM//g' {} +
'Zdjęcie015.jpg' would be renamed to 'Zdjecie015.jpg'

そして

❯ PERL_UNICODE=ASD find . -depth -execdir rename 's/\pM//g' {} +
Can't rename 'Zdjęcie015.jpg' to 'Zdjecie015.jpg': No such file or directory

ベストアンサー1

macOSで動作させることができなかったので、これが実際に答えであるかどうかはわかりませんが、私の問題に対する解決策のようです。

外付けドライブがNASであるため、SSHで接続して問題を直接解決しました。残念ながら、私はこのような素晴らしいツールにアクセスできなかったので、使用する必要がありrenameましたfind- うまくいきました!mvsed

これは私が使用するコマンドです:

find ./ -maxdepth 1 -name "*.JPG" -exec sh -c 'mv "$1" "$(echo "$1" | sed s/Zdj.*cie/zdjecie/)"' _ {} \;

PS:コメント欄を助けてくれたヒーローに感謝します!

おすすめ記事