J'ai de nombreux fichiers avec .abc
et je veux les changer en .edefg
Comment faire cela en ligne de commande ?
J'ai un dossier racine avec de nombreux sous-dossiers, la solution devrait donc fonctionner de manière récursive.
J'ai de nombreux fichiers avec .abc
et je veux les changer en .edefg
Comment faire cela en ligne de commande ?
J'ai un dossier racine avec de nombreux sous-dossiers, la solution devrait donc fonctionner de manière récursive.
J'utiliserais le commande mmv de la paquet du même nom :
mmv ';*.abc' '#1#2.edefg'
El ;
correspond à zéro ou plus */
et correspond à #1
dans le remplacement. Le site *
correspond à #2
. La version non récursive serait
mmv '*.abc' '#1.edefg'
C'est ce que j'ai fait et cela a fonctionné exactement comme je le voulais. J'ai utilisé le mv
commande. J'ai eu plusieurs .3gp
et je voulais tous les renommer en .mp4
Voici un petit oneliner à son sujet :
for i in *.3gp; do mv -- "$i" "ren-$i.mp4"; done
qui parcourt simplement le répertoire actuel, récupère tous les fichiers .3gp, puis les renomme (en utilisant le mv) en ren-name_of_file.mp4
Renommer les fichiers et les répertoires avec find -execdir | rename
Si vous avez l'intention de renommer à la fois des fichiers et des répertoires, et pas seulement avec un suffixe, alors c'est un bon modèle :
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
L'impressionnant -execdir
fait un cd
dans le répertoire avant d'exécuter la commande rename
contrairement à la commande -exec
.
-depth
s'assurer que le renommage s'effectue d'abord sur les enfants, puis sur les parents, pour éviter les problèmes potentiels de répertoires parents manquants.
-execdir
est nécessaire parce que rename ne fonctionne pas bien avec les chemins d'entrée qui ne sont pas des noms de base, par exemple, ce qui suit échoue :
rename 's/findme/replaceme/g' acc/acc
El PATH
Le piratage est nécessaire car -execdir
a un inconvénient très ennuyeux : find
est extrêmement opiniâtre et refuse de faire quoi que ce soit avec -execdir
si vous avez des chemins relatifs dans votre PATH
variable d'environnement, par exemple ./node_modules/.bin
à défaut de :
trouver : Le chemin relatif './node_modules/.bin' est inclus dans la variable d'environnement PATH, ce qui est peu sûr en combinaison avec l'action -execdir de find. Veuillez supprimer cette entrée de $PATH
Voir aussi : Pourquoi l'utilisation de l'action '-execdir' n'est pas sûre pour les répertoires qui sont dans le PATH ?
-execdir
est un GNU find extension à POSIX . rename
est basé sur Perl et provient du rename
paquet. Testé dans Ubuntu 18.10.
Renommer le contournement de lookahead
Si vos chemins d'entrée ne proviennent pas de find
ou si vous en avez assez de l'ennui des chemins relatifs, nous pouvons utiliser le lookahead de Perl pour renommer les répertoires en toute sécurité comme dans :
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Je n'ai pas trouvé d'analogue pratique pour -execdir
con xargs
: https://superuser.com/questions/893890/xargs-change-working-directory-to-file-path-before-executing/915686
El sort -r
est nécessaire pour s'assurer que les fichiers viennent après leurs répertoires respectifs, puisque les chemins les plus longs viennent après les plus courts avec le même préfixe.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.