2012-04-15 19 views
2

「?」を含むファイル名がいくつかあります。 ウィンドウにはこのような文字に問題があることがわかりました。 xargを使用して、フォルダ内のすべてのファイルの名前を再帰的に変更したい。例えばファイルの名前を再帰的に変更して文字を削除する

09 - grand hall?_10.mp3 

09 - grand hall_10.mp3 
+0

あなたがいる間に、スペースを削除しますか? – Shep

+0

それは悪くないです。何をしたらいいですか? – mahmood

+0

と解決策は 'xarg'を使用する必要がありますか? – Shep

答えて

1

for file in $(find folder -name '*.mp3'); do
  mv -v "$file" $(echo "$file" | tr ? _);
done


上記空白問題を有しています。これは良いです:

find folder -name '*.mp3' -exec echo "'{}'" \; |
  while read file; do
    echo -n "mv -v $file " && echo $file | tr ? _;
done | sh

アイデアは引用符でそれらをエコー、その後、すべてのファイルを見つけることです。出力を各ファイルのmvコマンドを構成するループwhileにパイプし、を新しいシェルにパイプします。

醜いですが、答えが気に入らない場合は、質問してはいけません。このワンライナーは、ファイル名は、単一/二重引用符やスペースが含まれている場合でも動作するはずです:-)

+0

スペースにノイズが発生しています。それらを取り除くために何をすべきか? – mahmood

+0

@AdamLiss私はこの中の '$ file'にある空白を使っていくつかの小さな問題を修正しましたが、' $(find _folder_ -name '* .mp3') 'のファイルのために' 'トークンの問題を解決しました。 'find -print0'に基づいて' read -d '' ' – je4d

+0

@ je4dに基づいて何かを試したいかもしれません。トークン化は固定されているので、フォーマットは意図通りです。助けてくれてありがとう! –

1

する必要がありますこれはひどく醜いですが、私は働くだろうワンライナーを見つけるために、個人的な挑戦としてそれを取りました。 :-)

find folder -name '*.mp3' -exec \
  sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh

戦略は、シェルに出力し、ファイルを検索引用符でその名前を持つファイルごとにmvコマンドを構築するためにechoを使用して、パイプすることです。

+1

find: '-exec 'に引数がない。 – mahmood

+0

@mahmood:修正された。キャッチをありがとう! –

+0

これはまだこの質問に対する最もエレガントな答えです。ありがとう! –

0

(IFS=\0;find . -name \*\\?\* -type f -print0| while read -d '' f;do mv -v $f $(echo $f|tr -d \?);done) 

は説明:

  1. findのみを名前に含むファイルを検索 '?'
  2. 最Parentheseの全体コマンドがで実行入れ
  3. 等、(-d ''によって)単一引用符、二重引用符、スペースなどの特殊文字を含むファイル名を扱うことができるIFSで区切り文字として\0find-print0による)とread設定現在のシェルのIFSを元の状態に保ちます。
  4. スクリプト内の.は、他のディレクトリに置き換えることができます。
  5. このスクリプトは非常に小さなキャッチですが、ファイルの名前とその親の名前のいずれかに '?'が含まれていると、ファイルが破損する可能性があります。これは処理することができますが、スクリプトは少し醜いと読みにくくなります。
関連する問題