Je veux renommer par lots un certain nombre de fichiers dans un répertoire afin que le numéro précédent et le fichier hypen soient supprimés du nom du fichier.
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name: XXX_01_xxxx_20130730235001_00000000.NEW
Comment puis-je faire cela avec une commande linux?
Cela devrait faire:
rename 's/^[0-9]*-//;' *
Il reçoit depuis le début le bloc [0-9]
(c'est-à-dire des nombres) plusieurs fois, puis le trait d'union -
et le supprime du nom du fichier.
Si rename
n'est pas dans votre ordinateur, vous pouvez utiliser une boucle et mv
:
mv "$f" "${f#[0-9]*-}"
$ ls
23-aa hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa hello aaa23-aa
Ou:
$ ls
23-a aa23-a hello
$ for f in *;
> do
> mv "$f" "${f#[0-9]*-}"
> done
$ ls
a aa23-a hello
Je pense que cette commande serait mieux si vous exécutez la commande ci-dessous:
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
Ici
ls * - répertorie les fichiers du dossier en cours
sed -e - exécute l'expression
p; - affiche l'ancien nom de fichier
s/ancien-nom/nouveau-nom/- produisant un nouveau nom de fichier
xargs -n2 - gère deux arguments pour mv
mv - obtient deux paramètres et effectue une opération de déplacement
Recommandation: avant d'exécuter mv, vérifiez ce que vous voulez faire avec echo .
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo
Exemple suivant renomme
SCCF099_FG.gz5329223404623884757.tmp à
SCCF099_FG.gz
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv
Si les premiers chiffres ont toujours la même longueur:
for F in *new ; do
mv $F ${F:8}
done
Le ${parameter:number}
effectue un développement de sous-chaîne - prend la chaîne à partir du 8ème caractère.
Il existe de nombreuses autres modifications de chaînes disponibles dans les extensions pour traiter d'autres cas.
Utilisation de renamer (compatible Windows, Mac et Linux):
$ renamer --find '/\d+-(.*)/' --replace '$1' *
Cela supprimera tous les numéros et le premier trait d'union depuis le début de tous les fichiers du répertoire en cours.
vimv vous permet de renommer plusieurs fichiers à l'aide des fonctionnalités d'édition de texte de Vim.
La saisie de vimv ouvre une fenêtre Vim qui répertorie tous les fichiers. Vous pouvez effectuer une recherche de modèle, une sélection visuelle, etc. pour modifier les noms. Après avoir quitté Vim, les fichiers seront renommés.
Le fichier screencast du fichier README montre comment il résout la question de l’affiche originale.
[Disclaimer: je suis l'auteur de l'outil]
Cela peut paraître un peu complexe, mais il est assez efficace et fonctionne bien sur les systèmes * nix et OSX. Il agit également de manière récursive en renommant les fichiers du répertoire en cours ainsi que tous les sous-répertoires:
find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
cp temp1 temp2 && \
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
paste temp1 temp2 > temp3 && \
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
sh ./temp3 && \
rm temp1 temp2 temp3
Voici un aperçu de ce qui vient de se passer:
La première ligne indique de rechercher (find
) tous les fichiers, en commençant par ceux du répertoire en cours (.
), dont le nom correspond au modèle (-regex
) de "7 chiffres, suivi d'un tiret, suivi de 0 caractère ou plus" ('.*/[0-9]\{7\}[-].*'
) et écrivez ces noms de fichiers et leurs chemins respectifs (-print
) dans un fichier nommé temp1 (> temp1
). Notez que la directive -print
n'est probablement pas nécessaire dans la plupart des cas, mais cela ne devrait pas faire de mal.
find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
Copiez ensuite (cp
) le contenu de temp1 dans un fichier nommé temp2.
cp temp1 temp2 && \
Ensuite, ouvrez le fichier temp2 à l'aide de l'éditeur de texte vi et donnez deux commandes vi (utilisez -c
pour indiquer chaque nouvelle commande):
:g
) le même motif que celui que nous avons recherché ci-dessus, à cette exception près que les résultats sont regroupés à l'aide de parenthèses (\([0-9]\{7\}[-]\)\(.*\)
).\2
).:x
).Le résultat dont étant ceci:
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
Maintenant, concaténez les lignes de temp1 avec celles de temp2 (paste
) et écrivez chaque nouvelle ligne combinée dans un fichier nommé temp3 (> temp3
).
paste temp1 temp2 > temp3 && \
Ensuite, exécutez à nouveau vi en procédant de la même manière que ci-dessus, sauf que cette fois, recherchez le début de chaque ligne (^
) dans le fichier temp3 et ajoutez mv et un espace juste après (mv
).
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
Ensuite, exécutez le contenu de temp3 (./temp3
) en tant que script shell (sh
).
sh ./temp3 && \
Enfin, supprimez (rm
) chacun des fichiers temporaires créés au cours du processus.
rm temp1 temp2 temp3
Il existe également un outil graphique très utile pyRenamer
https://wiki.ubuntuusers.de/pyRenamer/
J'aime vraiment quelque chose comme "renommer * .mp3 * .mp4".
Mais aucune autre réponse ne me donne ça. J'ai donc écrit un programme haskell pour le faire.
https://hackage.haskell.org/package/batch-rename
Avec cela, vous pouvez faire: batch_rename "DCIM * .jpg" "* .png"
Vous pouvez utiliser cet outil: rnm
Code pour faire ce que vous voulez:
rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'
-fo
est pour le mode fichier seulement-dp
est la profondeur du répertoire (-1
signifie profondeur illimitée).-rs
est une chaîne de remplacement. \d+-
regex est remplacé par une chaîne vide.-ss
est une chaîne de recherche, elle recherche les fichiers avec ^\d+-
regex. (Il est toutefois possible de l'omettre, certains messages d'erreur inoffensifs seront imprimés à l'écran).