「?」を含むファイル名がいくつかあります。 ウィンドウにはこのような文字に問題があることがわかりました。 xarg
を使用して、フォルダ内のすべてのファイルの名前を再帰的に変更したい。例えばファイルの名前を再帰的に変更して文字を削除する
09 - grand hall?_10.mp3
が
09 - grand hall_10.mp3
「?」を含むファイル名がいくつかあります。 ウィンドウにはこのような文字に問題があることがわかりました。 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
アイデアは引用符でそれらをエコー、その後、すべてのファイルを見つけることです。出力を各ファイルのmv
コマンドを構成するループwhile
にパイプし、を新しいシェルにパイプします。
醜いですが、答えが気に入らない場合は、質問してはいけません。このワンライナーは、ファイル名は、単一/二重引用符やスペースが含まれている場合でも動作するはずです:-)
する必要がありますこれはひどく醜いですが、私は働くだろうワンライナーを見つけるために、個人的な挑戦としてそれを取りました。 :-)
find folder -name '*.mp3' -exec \
sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh
戦略は、シェルに出力し、ファイルを検索引用符でその名前を持つファイルごとにmv
コマンドを構築するためにecho
を使用して、パイプすることです。
find: '-exec 'に引数がない。 – mahmood
@mahmood:修正された。キャッチをありがとう! –
これはまだこの質問に対する最もエレガントな答えです。ありがとう! –
:
(IFS=\0;find . -name \*\\?\* -type f -print0| while read -d '' f;do mv -v $f $(echo $f|tr -d \?);done)
は説明:
find
のみを名前に含むファイルを検索 '?'-d ''
によって)単一引用符、二重引用符、スペースなどの特殊文字を含むファイル名を扱うことができるIFS
で区切り文字として\0
、find
(-print0
による)とread
設定現在のシェルのIFS
を元の状態に保ちます。.
は、他のディレクトリに置き換えることができます。
あなたがいる間に、スペースを削除しますか? – Shep
それは悪くないです。何をしたらいいですか? – mahmood
と解決策は 'xarg'を使用する必要がありますか? – Shep