2013-03-27 7 views
1

Je voudrais renommer plusieurs fichiers, mais pas simplement ajouter ma chaîne à la fin ou au début du fichier. Je voudrais le placer dans un endroit précis. C'est la commande avec laquelle je travaille actuellement, mais elle ne peut que rajouter des choses au début et à la fin du nom de fichier.fichier bash renommer ajouter une chaîne dans un emplacement spécifique

for f in `ls ~/tmp/*`; do FILE=`basename $f`; echo "Rename:"$f;echo $FILE; mv "$f" "/home/tmp/JC_"${FILE%.*}"_hg19."${FILE#*.}""; done 

permet de dire que les noms de fichiers sont les suivants hell_1.txt (et laisse dire qu'il ya une tonne d'entre eux chacun avec un nombre différent pour la simplicité) Je voudrais ajouter un o dans le nom de fichier pour le nom résultant serait être hello_1.txt ce serait bien si vous aviez une solution générale non seulement pour cet exemple.

Répondre

0

si je comprends que vous voulez changer tout à "hel * o_NNN.txt." ("L'enfer * _ NNN.txt." en gardant le * entre "l'enfer" et "_NNN.txt" (NNN étant un nombre quelconque)

alors:..

for x in ~/tmp/*.txt; do 
    mv "$x" "$(echo "$x" | LC_COLLATE=C sed -e 's#\(hell.*\)\(_[0-9]*\.txt$\)#\1o\2#')" 
done 

I a ajouté le LC_COLLATE = C lors de l'appel sed de sorte que vous pouvez compter sur la "[0-9]" correspondant à des chiffres que '0' ou '1' ou ... ou '9'

(Si vous demande pourquoi ajouter le LC_COLLATE: avec quelques locales [A-Z] pourrait correspondre à toutes les lettres AZ ou ay (sauf 'z'!) comme dans ces locales les lettres apparaissent dans cet ordre: 'A' 'a' 'B' 'b' ... ' Z '' z '. Et avec d'autres locales, qui sait?)

(note: vous pouvez également remplacer "[0-9] " par la notation "[[: digit:]]", mais cela pourrait être moins portable: " old "version de sed ne connaitra pas cette notation et essaiera de faire correspondre" ['or': 'or ... ou' t 'ou': ', suivi d'un'] '(*, donc 0 , 1 fois ou plus) ... C'est pourquoi je n'aime pas utiliser les [[: choses:]] spéciales avec sed, tr, etc: je les vois comme moins portables. Utilisez plutôt perl si vous préférez les utiliser?

+0

désolé mais vous aurez besoin de m'expliquer cela un peu plus. Donc vous avez d'abord '(enfer.* \) 'Je devine que cela vous donne tout l'enfer (tout ce qui est ici le" 12 ")" _txt "(les nombres étant la variable changeante) (un petit changement par rapport au format original je suppose). Ensuite, vous faites défiler les nombres "_1.txt" "_2.txt" et ainsi de suite en gardant txt une constante (j'ai des extensions différentes pour des fichiers différents, donc quelque chose comme '$ {FILE # *.}' Fonctionne ici?) enfin, vous ajoutez le 'o' mais je ne suis pas clair ce que le 1 et 2 sont depuis le 12 était dans l'appel de caractères génériques? – crysis405

+1

's # (quelque chose1 \) \ (quelque chose2 \) # \ 1o \ 2 #': dit à sed de correspondre à "something1something2" et '\ (... \)' délimite les zones et les place dans des registres (\ 1 étant le premier registre, \ 2 le 2ème, etc.). Donc, il dit: Pour chaque correspondance de lignes "quelque chose1 quelque chose2", placez dans le registre \ 1 "quelque chose1", placez dans le registre \ 2 "quelque chose2, puis remplacez par \ 1o \ 2 (remplacera par:" quelque chose1quelquechose2 "(comme: sed -e 's # REGEXP # replacement #' va chercher une expression rationnelle "REGEXP", et la remplacer par "replacement") –

+0

si vous avez besoin de plus amples explications, s'il vous plaît demander (mais je ne serai pas en mesure de répondre avant la fin de soir, à moins que vous ne demandiez très bientôt ^^) –

2

cela devrait fonctionner:

for x in ~/tmp/*.txt; do mv $x `echo $x | sed -e 's#hell#hello#'`; done 
+0

Exactement. Cependant, ne vous habituez pas au dos. Utilisez '$ (...)' à la place, car les [backticks sont obsolètes] (http://stackoverflow.com/a/4708569/912144) – Shahbaz

+0

Les backticks ne vont nulle part bientôt, mais '$()' est plus propre et des nids. Si vous pouvez garantir que vous n'utiliserez que Bash (et pas simplement un shell POSIX), vous pouvez remplacer les backticks comme suit: 'mv $ x $ {x/hell/hello};'. Voir [le manuel de Bash] (https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion) pour plus d'informations, et [la référence du shell POSIX] (http: // pubs. opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02) pour ce que/bin/sh est garanti à supporter. – bonsaiviking

+0

pas tout à fait de travail, peut-être que j'ai trop simplifié cela. Disons que vous avez votre 'hell_1.txt' mais vous avez une piqûre après' hell' qui change et après cette chaîne vous voulez ajouter 'o'. Je ne sais pas si dans sed vous pouvez utiliser des caractères génériques pour vous donner quelque chose comme ça '| sed -e 's # hell * _ # hell * o_ # ' – crysis405

0

Que diriez-vous

rename 's/hell_/hello_/' /tmp/*.txt 
Questions connexes