2012-02-09 4 views
1

Maintenant, avant de faire face à la paume et cliquez sur l'entrée en double ou similaire, lisez la suite, cette question est à la fois théorique et pratique. Du titre, il est assez évident que j'essaie de faire, de trouver des fichiers, puis de les renommer. Eh bien le problème, il y a tellement de façons de le faire, que j'ai finalement décidé d'en choisir un, et d'essayer de le comprendre, théoriquement.en utilisant find et rename pour leur utilisation

Permettez-moi de la scène: Disons que j'ai 100 fichiers tous nommés comme celui-ci Image_200x200_nnn_AlphaChars.jpg, où le nnn est un nombre supplémentaire et AlphaChars-à-dire:

Image_200x200_001_BlueHat.jpg 
Image_200x200_002_RedHat.jpg 
... 
Image_200x200_100_MyCat.jpg 

Entrez l'étape trouver. Maintenant, avec un simple doublure je peux trouver tous les fichiers d'image dans ce répertoire. (Je ne sais pas comment faire insensible à la casse)

find . -type f -name "*.jpg" 

Entrez le stade renommer. Sur son propre, Rename vous attendent à effectuer les opérations suivantes:

rename <search> <replace> <haystack> 

Lorsque je tente de combiner les deux avec -print0 et xargs et quelques expressions régulières je coincé, et je suis presque sûr que c'est parce que renommer recherche la botte de foin ou de la partie de recherche ... (S'il vous plaît n'expliquer si vous comprenez ce qui se passe après la conduite)

find . -type f -name "*.jpg" -print0 | xargs -0 rename "s/Image_200x200_(\d{3})/img/" 

donc, le but est d'obtenir la découverte de donner renommer le nom original d'image , et remplacer Oui, je sais que les doublons poseront un problème, et oui, je sais que les espaces dans le nom vont aussi faire de ma vie un enfer, et ne commencent même pas avec les sous-répertoires et les sous-répertoires. le semblable. Pour rester simple, nous parlons d'un seul répertoire, et tous les noms de fichiers sont uniques et sans caractères spéciaux.

J'ai besoin de comprendre les bases fondamentales, avant de passer aux choses hardcore. Quelqu'un a-t-il envie d'aider?

+2

Pour l'insensibilité à la casse, faites '-iname' à la place de' -name'. – AlG

+1

Si vous connaissez vos fichiers sont dans un seul répertoire, fossé 'find'. 'find' est parfait lorsque vos fichiers cible sont dispersés dans une hiérarchie de répertoires, mais dans un seul répertoire, vous trouverez [pattern glob ou extended-glob] (http://www.gnu.org/software/bash/manual/ bashref.html # Pattern-Matching) fera l'affaire. Ensuite, vous avez: 'renommer 's/Image_200x200 _ (\ d {3})/img /" * .jpg' –

+0

J'aime simplifier, merci @ glenn-jackman, mais ce changement de nom est évidemment de plus en plus compliqué, donc J'utilise find, comme la prochaine étape serait de le faire, de trouver et de remplacer récursivement des fichiers et de les renommer, et plus tard, avec des espaces dans les noms ou les caractères spéciaux ... mais simples basic sont importants pour commencer:) –

Répondre

3

Une autre approche consiste à éviter d'utiliser rename - bash est assez capable:

find ... -print0 | while read -r -d '' filename; do 
    mv "$filename" "img_${filename##*_}" 
done 

la partie ##*_ supprimer tous les caractères qui ont précédé et y compris le dernier trait de soulignement de la valeur.

+0

Il s'avère donc que le renommage dans CentOS et RedHat n'est PAS la version perl, expliquant pourquoi il ne répond pas aux expressions régulières que je lui donne. Il semble que cette find-read-mv est ma seule solution pour l'instant. Merci @ glenn-jackman ça marche. Maintenant, pour comprendre ce que tout cela signifie, c'est-à-dire revenir aux livres ... –

1

Si vous n'avez pas besoin -print0 (vous êtes sûr que vos noms de fichiers ne contiennent pas des sauts de ligne), vous pouvez simplement faire:

find . -type f -name "*.jpg" | xargs rename 's/Image_200x200_(\d{3})/img/' 

Ce qui fonctionne pour moi:

~/tmp$ touch Image_200x200_001_BlueHat.jpg 
~/tmp$ touch Image_200x200_002_RedHat.jpg 
~/tmp$ touch Image_200x200_100_MyCat.jpg 
~/tmp$ find . -type f -name "*.jpg" | xargs rename 's/Image_200x200_(\d{3})/img/' 
~/tmp$ ls 
img_BlueHat.jpg img_MyCat.jpg img_RedHat.jpg 

Qu'est-ce passe après le pipe est que xargs est en train d'analyser la sortie de find et de passer cela en morceaux raisonnables à une commande de renommer, qui exécute une regex sur le nom de fichier et renommer le fichier en résultat.

mise à jour: Je n'ai pas essayé votre version avec les terminaisons null au début, mais cela fonctionne aussi pour moi. Peut-être avez-vous testé avec une regex différente?

+0

Je l'ai juste essayé de faire un pas sur ma boîte et rien ne se passe. C'est pourquoi j'ai posé la question, car je pensais que je fais quelque chose de mal. Utilisation de ** Linux CentOS-55-64-minimal 2.6.18-274.17.1.el5 # 1 SMP GNU/Linux ** avec _/usr/bin/rename_ –

+0

Odd, je suis en train de tester sur debian, avec 'rename' à partir du paquet 'perl-5.10.1' et de la version' findutils' '4.4.2-1 + b1'. 'Linux 2.6.32.33'. – beerbajay

+0

Well CentOS 5.5 avec 'rename'from' util-linux-2.13-0.56.el5.x86_64' et 'find' de' findutils-4.2.27-6.el5.x86_64', un autre serveur avec RedHat 6 utilisant a le même maladie, il utilise les mêmes paquets. Je suis perplexe ... Alors je pense que je comprends la théorie ... Quelque chose d'autre est faux je suppose ... mais quoi ... –

0

Qu'est-ce qui se passe après la conduite:

find ... -print0 | xargs -0 rename "s/Image_200x200_(\d{3})/img/" 

xargs est en train de lire les noms de fichiers produits par la commande find, et l'exécution de la commande rename à plusieurs reprises, annexant quelques noms de fichiers à la fois. L'effet net sera quelque chose comme:

rename '...' file001 file002 file003 file004 file005 file006 file007 file008 file009 file010 
rename '...' file011 file012 file013 file014 file015 file016 file017 file018 file019 file010 
rename '...' file021 file022 file023 file024 file025 file026 file027 file028 file029 file010 
... 
rename '...' file091 file092 file093 file094 file095 file096 file097 file098 file099 file100 

Le find -print0 | xargs -0 est une combinaison pratique pour la gestion des fichiers de manière plus sûre qui peuvent contenir des espaces.