https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux
https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name
https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension
https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux
Ces articles mentionnés ont tous répondu à ma question. Cependant, aucun d'entre eux ne fonctionne pour moi. Je suppose que c'est parce que la chaîne que je tente de remplacer contient un #. Y a-t-il un moyen spécial de résoudre ce problème?
J'ai un fichier image qui a été remplacé par # U00a9 lors d'une migration de site. Celles-ci ressemblent à ceci:
Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg
et je veux le changer en quelque chose comme ceci:
Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg
MISE À JOUR:
Ces exemples commencent tous par "LU00a9ucky mais voici de nombreuses images avec des noms différents. Je cible simplement la partie" # U00a9 "de la chaîne à remplacer par" safe ".
rename
commande. Je soupçonne que votre changement de nom serait aussi simple querename -n 's/#/safeNBC/' *.jpg
.rename -n 's/#U00a9/safe/' *.jpg
et la commande a été acceptée mais aucun changement ne s'est produit.-n
c'est l'no act
option. Ce qui vous permet de voir si cela fonctionne avant de l'utiliser. Le résultat affiché à l'écran indique-t-il correctement les nouveaux noms potentiels?Réponses:
Pour remplacer
#
par lessomethingelse
noms de fichiers dans le répertoire actuel (non récursif), vous pouvez utiliser l' utilitaire de renommage GNU :Des personnages comme
-
doit être échappé avec un\
.Pour votre cas, vous voudriez utiliser
Notez que si vous ne souhaitez utiliser qu'une sélection de fichiers, par exemple uniquement
*.jpg
, ajustez l'entrée finale pour qu'elle corresponde à cette sélection:Pour effectuer un test avant de changer les noms de fichiers, utilisez l'
-n
indicateur:Pour OS X, GNU renommage peut être installé à l' aide homebrew :
brew install rename
.la source
rename
utilisez-vous?# sudo pacman -S perl-rename
installera la version perl, qui est plus puissante et qui suffira peut-être pour que cette réponse fonctionne pour vous.rename --version
retournerename from util-linux 2.29.2
donc ce n'est effectivement pas la version Perl.rename
utilitaires communs, mais aucun d'entre eux n'est développé par GNU: les distributions basées sur Debian incluent unrename
utilitaire avec leur paquet Perl, tandis que les distributions basées sur Red Hat utilisent l'rename
utilitaire de l'util-linux
organisation du noyau Linux. Votre lien est avec la fonctionrename
C de la bibliothèque standard GNU./g
enrename 's/#U00a9/safe/g' *
trouver la liste des fichiers puis remplacer le mot clé. ci-dessous est un exemple
la source
mv
arguments, au cas où il y aurait des espaces dans le nomCe n'est pas difficile, assurez-vous simplement d'échapper l'octothorpe (#) dans le nom en ajoutant une barre oblique inversée (\).
la source
#
sons comme ce dont j'avais besoin. Je ne vois pas de barre oblique inverse dans votre exemple. Devrait-il ressembler à ceci:s/\#U00a9/safe/
Pour sortir
#
du shell, utilisez simplement des guillemets simples ('#'
), des guillemets doubles ("#"
) ou des barres obliques inverses (\#
).Le plus simple dans votre cas serait d'utiliser la
rename
commande (si elle est disponible):la source
rename 's/#/somethingelse/' *
) ne fonctionnait pas sur ma machine (Arch Linux), celle-ci fonctionnait.je ne sais pas comment faire, mais vous pouvez essayer ceci dans un shell bash:
explication:
Pour en savoir plus sur la substitution de paramètres (qui est une OMI extrêmement sous-utilisée): http://www.tldp.org/LDP/abs/html/parameter-substitution.html
la source
Les exemples ci-dessus ne fonctionnaient pas sur mon système (CentOS 5.6). J'ai donc trouvé une commande (peut-être plus spécifique au système) qui fonctionne (remarque: nécessité d'échapper à '#' avec la
\
ligne de commande):rename \#U00a9 safe *.jpg
[Aussi: je n'ai pas encore assez de réputation pour commenter, alors en réponse à la question de Nikhil concernant l'utilisation de
/g
inrename 's/old_string/new_string/g'
(posée dans les commentaires pour une autre réponse ci-dessus):Utilisez le
g
modificateur pour effectuer une substitution "globale" (c'est-à-dire pour substituer new_string à old_string autant de fois que old_string se produit). Cela ne devrait pas être nécessaire dans ma réponse car lerename
sera appliqué à tous les fichiers spécifiés avec*
. Voir https://www.computerhope.com/unix/rename.htm pour une explication concise de ce modificateur et d'autres.]la source
rename
celle des systèmes d'exploitation dérivés de Debian. Voir unix.stackexchange.com/a/238862/135943 . Et au fait, CentOS 5.6 est assez ancien et je vous recommande de le mettre à jour.Voici la solution de DTK intégrée à une fonction bash réutilisable:
Voici comment vous pouvez l'utiliser:
la source
A en fait
rename
une option exactement pour cela appelé--subst
ou-s
en bref. Pas besoin d'utiliser la syntaxe regex.Si vous souhaitez remplacer / remplacer plusieurs occurrences, utilisez
--subst-all
ou-S
.BTW, je voulais seulement remplacer une chaîne par rien (retirez-la du nom du fichier) ... eh bien nous avons aussi une option pour elle
-d/--delete
et-D/--delete-all
:la source
Une autre option consiste à utiliser
pyRenamer
une application spécialement conçue pour renommer des lots.Il peut être installé avec
sudo apt-get install pyrenamer
Pour plus de détails sur l'utilisation, reportez-vous à son fichier README sur GitHub .
la source