Il comando per fare qualsiasi cosa in modo ricorsivo a una struttura di directory è find
:
find . -name "*.jpg" -exec bash -c 'file="{}"; cp "$file" "${file%%.jpg}1.jpg"' \;
L'utilizzo di -exec
anziché for i in $(find ...)
gestirà i nomi di file che contengono uno spazio. Certamente, c'è ancora una frase che vince; se il nome file contiene "
, lo file="{}"
si espanderà a file="name containing "quote characters""
, che è ovviamente rotto (file
diventerà name containing quote
e proverà ad eseguire il comando characters
).
Se si dispone di tali nomi di file, o si potrebbe, quindi stampare ogni nome di file separato con caratteri nulli (non consentiti nei nomi dei file) utilizzando -print0
, e utilizzare while read -d $'\0' i
loop negli nulli delimitati risultati:
find . -name "*.jpg" -print0 | \
(while read -d $'\0' i; do cp "$i" "${i%%.jpg}1.jpg"; done)
Come con qualsiasi comando complesso come questo, è una buona idea testarlo senza eseguire alcunché per assicurarsi che si stia espandendo a qualcosa di sensato prima di eseguirlo. Il modo migliore per farlo è quello di anteporre il comando vero e proprio con echo
, così invece di eseguirlo, vedrete i comandi che verrà eseguito:
find . -name "*.jpg" -print0 | \
(while read -d $'\0' i; do echo cp "$i" "${i%%.jpg}1.jpg"; done)
Una volta che hai eyeballed ei risultati sembra buono, rimuovere echo
ed eseguirlo di nuovo per eseguirlo per davvero.
fonte
2012-11-05 03:22:30
'ogni file nelle sottodirectory di quella directory' = in modo ricorsivo – nickhar