ファイル名から特定の特殊文字を削除する

ファイル名から特定の特殊文字を削除する

外付けハードドライブにフォルダを転送する際に問題が発生しています。HD のフォーマットを変更したくありません。

フォルダーには 100 個のファイルがあり、それらのコピーを妨げているエラーは特殊文字 (正確にはわかりませんが、「|」と「.」だと思いますが、他にもあるはずです) が原因です。これらの特殊文字を手動で名前変更/削除していますが、面倒です。

提案は歓迎しますが、ファイル名から特定の文字を削除するか (これを行うと .m4a などで問題が発生するでしょうか?)、必要に応じてアンダースコアに置き換える方法を探していると思います。私が持っている唯一の手がかりは perl rename ですが、まだ試していません。

'y/|/_/' * をこのように名前変更しますか?

ご提案があればよろしくお願いします

答え1

はい、(Perl ベースの)renameコマンドはこれに適しています。-nまたは--nonoオプションを追加して、置換を試用することができます。例:

   -n, --nono
           No action: print names of files to be renamed, but don't rename.

例えば

$ rename -n 'y/|./__/' *\|*
rename(foo|bar.baz, foo_bar_baz)
rename(foo|bar|baz, foo_bar_baz)

注意してrenameくださいない名前が一意でない場合はファイルを破壊的に上書きできます。

$ rename -v 'y/|./__/' *\|*
foo|bar.baz renamed as foo_bar_baz
foo|bar|baz not renamed: foo_bar_baz already exists

注意して.くださいないファイル名のコンテキストでは特殊文字なので、実際に置き換えないことをお勧めします。

答え2

一般的に、mmv大量の名前変更タスクに最適です。

しかし、この特定のケースでは、私はまったく異なる方法を採用します。つまり、いくつかのシェル コマンドを含むシェル スクリプトを生成し、それが本当に必要なものであるかどうかをよく調べてから、それを実行します。

大まかな概要:

ls -Q >/tmp/old.txt
cp /tmp/old.txt /tmp/new.txt

ls -Q各名前の前後に二重引用符を追加します。つまり、 または になり"foo*bar"ます"foo | bar"

次に、 内の不要な文字を/tmp/new.txt、エディタを使用して手動で、またはsed -i -e(またはperl -p -i -eを好む場合は )またはtrまたは を使用して置き換えますtr -d。重要:ファイル内の順序を変更したり、行を削除したり追加したりしないでください。

いずれにせよ、/tmp/new.txt新しい名前が本当に希望どおりのものかどうかをよく検討してください。

重複した名前がないか確認してください。 ( sort /tmp/new.txt | uniq -r) 重複がないことを確認し、重複がある場合は、その行を手動で編集して一意の名前を取得します。

次に、ファイルをコマンドと一緒に配置しpaste、各行をmvコマンドに変更します。

paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename

このコマンドは、 から 1 行と から 1 行pasteを取得し、間に空白を 1 つ入れて 1 行にまとめます。 の部分は、各行の先頭に を追加します。既存のファイルが上書きされるのを防ぎます。/tmp/old.txt/tmp/new.txtsedmv -nmv -n

このファイルには次のような行がたくさん含まれています

mv -n "foo" "bar"
mv -n "abc" "def"

ファイルをもう一度確認し、それが目的のものであると確信できたら、 で実行しますsh /tmp/bulk-rename

関連情報