コマンドへディレクトリ構造に再帰的に何かをfind
です:
find . -name "*.jpg" -exec bash -c 'file="{}"; cp "$file" "${file%%.jpg}1.jpg"' \;
for i in $(find ...)
の代わりに-exec
を使用すると、スペースを含むファイル名が処理されます。もちろん、まだ1つの引用符があります。ファイル名に"
が含まれている場合、file="{}"
はfile="name containing "quote characters""
に展開されますが、これは明らかに壊れています(file
はname containing quote
になり、characters
コマンドを実行しようとします)。
あなたがそのようなファイル名を持っている、またはあなたが、その後、-print0
を使用して(ファイル名で許可されていない)、ヌル文字で区切られた各ファイル名をプリントアウトし、ヌル区切りの結果をループにwhile read -d $'\0' i
を使用する可能性がある場合:
find . -name "*.jpg" -print0 | \
(while read -d $'\0' i; do cp "$i" "${i%%.jpg}1.jpg"; done)
このような複雑なコマンドの場合と同様に、何も実行せずにテストして、実行前に賢明に展開していることを確認することをお勧めします。これを行うための最善の方法は、echo
と実際のコマンドを付加することで、その代わりにそれを実行するので、あなたはそれが実行されるコマンドが表示されます:あなたはそれをeyeballedてきたとの結果が、よさそうだしたら
find . -name "*.jpg" -print0 | \
(while read -d $'\0' i; do echo cp "$i" "${i%%.jpg}1.jpg"; done)
をecho
を削除して再度実行して、実際に実行してください。
'そのディレクトリのサブディレクトリ内のすべてのファイル' =再帰的に – nickhar