2010-07-19 8 views
3

J'ai beaucoup de fichiers dont le nom se termine par '_100.jpg'. Ils se propagent dans des dossiers/sous-dossiers imbriqués. Maintenant, je veux un truc pour copier récursivement et renommer chacun d'eux pour avoir un suffixe de '_crop.jpg'. Malheureusement, je ne suis pas familier avec les scripts bash donc je ne connais pas la façon exacte de faire cette chose. J'ai googlé et essayé la commande 'find' avec le '-exec' para mais sans chance.Bash: copier et renommer récursivement des fichiers

Plz aidez-moi. Merci.

+0

Question connexe: [Meilleure façon de renommer les fichiers en fonction de plusieurs modèles] (http://stackoverflow.com/a/25597051/2654678). –

Répondre

6
find bar -iname "*_100.jpg" -printf 'mv %p %p\n' \ 
    | sed 's/_100\.jpg$/_crop\.jpg/' \ 
    | while read l; do eval $l; done 
+0

Excellent! C'est la solution la plus simple que j'ai jamais lu sur ce sujet! Quand je l'ai lu, je me suis demandé pourquoi je ne l'avais pas trouvé seul! Peut-être b/c je ne suis pas assez intelligent :) – PierrOz

2

si vous avez bash 4

shopt -s globstar 
for file in **/*_100.jpg; do 
    echo mv "$file" "${file/_100.jpg/_crop.jpg}" 
one 

ou à l'aide de trouver

find . -type f -iname "*_100.jpg" | while read -r FILE 
do 
    echo mv "${FILE}" "${FILE/_100.jpg/_crop.jpg}" 
done 
+0

guillemets manquants, ne fonctionne pas avec les noms de fichiers contenant des sauts de ligne. Utilisez 'find ... -exec' ou' find ... -print0 | xargs -0' à la place. – Philipp

+0

oui, guillemets manquants et fixes. Donc pas besoin d'utiliser xargs. La réponse acceptée n'a pas de guillemets aussi. – ghostdog74

1

Il utilise un script Perl que vous avez déjà sur votre système. Il est parfois appelé prename au lieu de rename:

find /dir/to/start -type f -iname "*_100.jpg" -exec rename 's/_100/_crop' {} \; 

Vous pouvez faire les regexes plus robuste si vous avez besoin pour protéger les noms de fichiers qui ont « _100 » répétées ou dans certaines parties du nom que vous ne voulez pas changé.

Questions connexes