回答:
明示的なループのない代替コマンド(man find
):
find . -type f -exec mv '{}' '{}'.jpg \;
説明:これ-type f
により、現在のディレクトリ(.
)から始まるすべてのファイル()が再帰的に検索され、それぞれに移動コマンド(mv
)が適用されます。また、{}
スペースを含むファイル名(および改行も)が適切に処理されるように、を囲む引用符にも注意してください。
for
ファイルのリストを反復するためにループ動揺bashを参照する場合、それは正しくありません。bash for
ループは、各mv
コマンドを繰り返し発行します。
find
、最初にファイルのリストを設定しますか?私はそう思うが、無限ループをコーディングする前にこの点を明確にしたい。-exec
-not -name "*.*"
するとうまくいきます。
これは拡張子のないファイルを見つけ、.jpgを追加します
find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
これは少し遅れますが、これまでの解決策よりも優れた解決策(読みにくいかもしれませんが)を追加したいと思いました。
find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'
find | xargs
ファイルごとに新しいプロセスをフォークする必要がないので、パターンを使用すると、通常、より効率的な実行になります。
これには、従来の名前変更ではなく、Debian風味のディストリビューション(別名、プレネーム)にある名前変更のバージョンが必要であることに注意してください。ただし、これは非常に小さなperlスクリプトなので、どのシステムでも上記のコマンドを使用するのは簡単です。
このような、
for f in $(find . -type f); do mv $f ${f}.jpg; done
私はあなたがスペースで区切られたファイル名を持っていることを期待していません、
もしそうなら、名前は少し処理される必要があります。
あなたには、いくつかの他のディレクトリからコマンドを実行したい場合、
あなたは置き換えることができfind .
てfind /target/directory
。
-type
。
rename
それが拡張子なしでファイルの名前を変更できるかどうかわからない(私は現在Windows 7にいます)
rename
。1つはutil-linux-ngに含まれるCプログラム、もう1つは私たちの大学のDebianマシン上のPerlプログラム(Wall自身)です。実際、どちらも再帰を行いません。