J'ai un certain nombre de fichiers:
10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg
Je veux renommer avec ce format:
10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg
Il doit supprimer l' _
horodatage in et ajouter le _TIMING
.
command-line
batch-rename
Jojo Mendoza
la source
la source
10.3.100.179
par10.4.100.135
. Est-ce ce que vous voulez ou voulez-vous simplement supprimer le_TIMING
et le_
du temps?10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg
(et "TIMING" pourrait alors même être supprimé, car il ressemble désormais clairement à une date et une heure (et des millisecondes), surtout lorsque la norme devient plus répandue. Le T fait partie de la norme et je a grandi pour l'aimer (et le retirer brise la norme ^^):
un nom de fichier. Je crois que Windows ne le prend pas en charge.Réponses:
Installez
renameutils
et utilisezqmv
avec votre éditeur de texte préféré.qmv
charge tous les noms dans votre éditeur et lorsque vous enregistrez et fermez, il applique vos modifications aux fichiers réels. Si les changements sont incohérents (par exemple, deux fichiers ont le même nom), ils seront abandonnés sans rien toucher. Il gère également correctement les renommages circulaires.Je fais habituellement:
de sorte qu'il affiche une seule colonne de noms (faire: destination uniquement). Voici à quoi ça ressemble:
Si vous le combinez avec les multiples curseurs de SublimeText, Atom ou Visual Studio Code, cela fait un outil très agréable et puissant pour renommer en masse. Par exemple, pour Atom, vous le feriez
EDITOR="atom -w" qmv -f do
.la source
Utilisez
rename
...Avec
-n
cela affichera ce qu'il va faire sans apporter de modifications:S'il semble correct, retirez le
-n
Expliquant ...
s/something/something_else/
rechercher et remplacer^
le début du nom (ancrage)[0-9]
n'importe quel chiffre+
un ou plusieurs des caractères précédents\.
littéral.
(sans que\
cela corresponde à aucun caractère)()
garder cette partie$1$2$3$3
retour des références aux choses appariées plus tôt et conservées avec()
Remarque:
*
à la fin de la commande correspond tous les fichiers visibles dans le répertoire en cours. Utilisez un globe plus approprié si nécessaire.la source
prename
(p pour perl, car le premier argument est une expression perl)mmv
peut le faire comme suit:# 1, # 2, # 3, ... fait référence à chacun au '*' correspondant ici.
Il est encore plus court avec:
la source
Une autre
rename
approche:Si cela semble fonctionner comme vous le souhaitez, supprimez le
-n
.la source
Vous pouvez également utiliser les éléments suivants. Faites d'abord une sauvegarde de vos fichiers et essayez ceci:
sed 's/\(.*\)_\(.*\)_/\1\2/')
supprime les_
caractères de l'horodatage.Par exemple:
la source
find -maxdepth 1 -exec rename ... {} +
pour regrouper la liste du répertoire en cours sur la ligne de commande de renommer. (ajoutez-name *.jpg
ou ce que vous voulez). Cela s'exécutera beaucoup plus rapidement qu'une boucle shell qui bifurque + les exécutablessed
etmv
pour chaque nom de fichier, au lieu d'un simple appel système de renommage. (Vous pourriez vous débarrasser de l'sed
utilisation des trucs regex intégrés de bash, mais la fourchemv
est toujours lente.)Vous avez probablement terminé, mais voici une (toute)
bash
solution toute simple : la"solution simple ... bash" est-elle un oxymore?
PS: La logique de la boucle a été testée avec l'un de vos exemples de noms de fichiers. C'est passé.
la source
[[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]];
newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpg
ou quelque chose. (totalement non testé et probablement faux, mais l'idée générale est que les groupes de capture entrent dans le tableau BASH_REMATCH.)bash
) pour capturer des groupes, et pour être parfaitement honnête, bash n'est pas la première langue avec laquelle je les essayerais. (Je pense quebash
c'est une langue laide.) Pourtant, c'est une bonne solution et cela m'a appris quelque chose de si bravo.printf -v "$3" ...
pour définir la variable dont le nom est$3
dedans.) Démonter la ligne de commande entière et la remettre ensemble est assez difficile à suivre / déboguer, au moins je l'ai trouvé de cette façon en essayant de le nettoyer / corriger les bugs. Voir le code sur githubSi vous pouviez utiliser l'interface graphique, je recommanderais pyRenamer .
Il est présent dans la plupart des distributions, fi dans Ubuntu:
Il peut faire tout ce que vous voulez et plus encore.
la source
Voici votre + + + oneliner brut intégré (love oneliners):
find
xargs
sed
mv
Explication:
find . -name "*.jpg" | sort | xargs sh -c <command> sh
: liste tous les JPEG du répertoire courant puis exécutez une commande shell pour chacun (le tri est optionnel bien sûr, mais gardez les choses un peu plus propres si vous vous connectez quelque part)-print0
,-z
,-0
: Il est bonne habitude à des éléments séparés avec binaire0
lorsque tokenizing noms de fichiers pour éviter les problèmes avec in-the-middle-espaces blancs (pas votre cas si)mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");
: (Antislashs dans lesed
« s regex ne contribuent pas à sa lisibilité, mais il est facile) renommer chaque fichier en remplaçant la séquence underscore-separeted de 8 + 6 + 4 chiffres avec leur concaténation contiguë , plus cette_TIMING
chose (\i
est un backreference aui
- th regex group).Réfs : Xargs - homme sed
la source