'?'を含むファイル名がいくつかあります ご存知のように、ウィンドウにはそのような文字の問題があります。を使用して、フォルダ内のすべてのファイルの名前を再帰的に変更したいxarg
。例えば
09 - grand hall?_10.mp3
する必要があります
09 - grand hall_10.mp3
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
醜いですが、答えが気に入らなければ、質問するべきではありませんでした。:-)
これはひどく醜いですが、私はそれを個人的な挑戦として、うまくいくワンライナーを見つけることを考えました。:-)
find folder -name '*.mp3' -exec \
sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh
戦略は、ファイルを検索し、それを使用して名前を引用符で囲んだ各ファイルecho
のコマンドを作成し、出力をシェルにパイプすることです。mv
このワンライナーは、ファイル名に一重引用符または二重引用符とスペースが含まれている場合でも機能するはずです。
(IFS=\0;find . -name \*\\?\* -type f -print0| while read -d '' f;do mv -v $f $(echo $f|tr -d \?);done)
説明:
find
名前に「?」が含まれているファイルのみを検索します\0
の区切り文字として設定すると、一重引用符、二重引用符、スペースなどの特殊文字を含むファイル名を処理できます。IFS
find
-print0
read
-d ''
IFS
そのまま維持されます。.
は、他のディレクトリに置き換えることができます。