2

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

09 - grand hall?_10.mp3

する必要があります

09 - grand hall_10.mp3
4

3 に答える 3

2

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

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

醜いですが、答えが気に入らなければ、質問するべきではありませんでした。:-)

于 2012-04-15T13:54:04.153 に答える
1

これはひどく醜いですが、私はそれを個人的な挑戦として、うまくいくワンライナーを見つけることを考えました。:-)

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

戦略は、ファイルを検索し、それを使用して名前を引用符で囲んだ各ファイルechoのコマンドを作成し、出力をシェルにパイプすることです。mv

于 2012-04-15T13:48:37.567 に答える
0

このワンライナーは、ファイル名に一重引用符または二重引用符とスペースが含まれている場合でも機能するはずです。

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

説明:

  1. find名前に「?」が含まれているファイルのみを検索します
  2. 、(by )および(by )\0の区切り文字として設定すると、一重引用符、二重引用符、スペースなどの特殊文字を含むファイル名を処理できます。IFSfind-print0read-d ''
  3. 最も外側の括弧は、コマンド実行全体をサブシェルに配置するため、現在のシェルはIFSそのまま維持されます。
  4. スクリプト内の.は、他のディレクトリに置き換えることができます。
  5. ただし、このスクリプトには非常に小さな問題があります。ファイルの名前とその親の名前の1つに「?」が含まれていると壊れることがあります。これは処理できますが、スクリプトは少し醜くなり、読みにくくなります。
于 2012-04-15T16:34:22.267 に答える