J'ai plusieurs 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 le _
dans l'horodatage et ajouter le _TIMING
.
Installez renameutils
et utilisez qmv
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 modifications sont incohérentes (par exemple, deux fichiers portent le même nom), il sera abandonné sans rien toucher. Il gère également les renommage circulaires correctement.
Je fais habituellement:
$ qmv -f do
de sorte qu'il ne montre qu'une colonne de noms (do: destination-only). Voici à quoi ça ressemble:
Si vous le combinez avec les multiples curseurs de SublimeText, Atom ou Visual Code, il constitue un outil très agréable et puissant pour renommer en bloc. Par exemple, pour Atom, vous feriez EDITOR="atom -w" qmv -f do
.
Utilisez rename
...
rename -n 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *
Avec -n
, cela affichera ce qu'il va faire sans apporter de modifications:
rename(10.3.100.179_01_20161018_230014_5335.jpg, 10.3.100.179_01_201610182300145335_TIMING.jpg)
rename(10.3.100.179_01_20161018_231514_0814.jpg, 10.3.100.179_01_201610182315140814_TIMING.jpg)
rename(10.3.100.179_01_20161018_233014_5706.jpg, 10.3.100.179_01_201610182330145706_TIMING.jpg)
rename(10.3.100.179_01_20161018_234514_0896.jpg, 10.3.100.179_01_201610182345140896_TIMING.jpg)
Si cela vous semble correct, supprimez le -n
$ rename 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *
$ ls
10.3.100.179_01_201610182300145335_TIMING.jpg 10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_201610182315140814_TIMING.jpg 10.3.100.179_01_201610182345140896_TIMING.jpg
Expliquant ...
s/something/something_else/
rechercher et remplacer^
le début du nom (ancrage)[0-9]
n'importe quel nombre+
un ou plusieurs caractères précédents\.
literal .
(sans \
cela correspond à n'importe quel caractère)()
pour garder cette partie$1$2$3$3
retourne les références aux éléments correspondants précédemment et conservées avec ()
Remarque: le *
figurant à la fin de la commande correspond à tous les fichiers visibles du répertoire en cours. Utilisez un glob plus approprié si nécessaire.
mmv
peut le faire comme suit:
mmv '*_*_*_*_*.jpg' '#1_#2_#3#4#5_TIMING.jpg'
10.3.100.179_01_20161018_230014_5335.jpg 10.3.100.179_01_201610182300145335_TIMING.jpg
N ° 1, N ° 2, N ° 3, ... fait ici référence à chacun des '*' correspondants.
C'est encore plus court avec:
mmv '*_*_*.jpg' '#1#2#3_TIMING.jpg'
Une autre approche rename
:
$ rename -n 's/(.*)_(.*)_(.*)\./$1$2$3_TIMING./' *
10.3.100.179_01_20161018_230014_5335.jpg -> 10.3.100.179_01_201610182300145335_TIMING.jpg
10.3.100.179_01_20161018_230114_5395.jpg -> 10.3.100.179_01_201610182301145395_TIMING.jpg
10.3.100.179_01_20161018_230114_5492.jpg -> 10.3.100.179_01_201610182301145492_TIMING.jpg
10.3.100.179_01_20161018_230214_5630.jpg -> 10.3.100.179_01_201610182302145630_TIMING.jpg
10.3.100.179_01_20161018_231514_0814.jpg -> 10.3.100.179_01_201610182315140814_TIMING.jpg
10.3.100.179_01_20161018_231614_1145.jpg -> 10.3.100.179_01_201610182316141145_TIMING.jpg
10.3.100.179_01_20161018_231614_1264.jpg -> 10.3.100.179_01_201610182316141264_TIMING.jpg
10.3.100.179_01_20161018_231714_7135.jpg -> 10.3.100.179_01_201610182317147135_TIMING.jpg
10.3.100.179_01_20161018_233014_5706.jpg -> 10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_20161018_233114_6047.jpg -> 10.3.100.179_01_201610182331146047_TIMING.jpg
10.3.100.179_01_20161018_233114_6146.jpg -> 10.3.100.179_01_201610182331146146_TIMING.jpg
10.3.100.179_01_20161018_234514_0896.jpg -> 10.3.100.179_01_201610182345140896_TIMING.jpg
10.3.100.179_01_20161018_234614_0547.jpg -> 10.3.100.179_01_201610182346140547_TIMING.jpg
10.3.100.179_01_20161018_234614_0658.jpg -> 10.3.100.179_01_201610182346140658_TIMING.jpg
Si cela semble fonctionner comme vous le souhaitez, supprimez le -n
.
Vous pouvez également utiliser ce qui suit. Commencez par sauvegarder vos fichiers et essayez ceci:
find . -name "*.jpg" -type f -print0| while read -d $'\0' file
do
#extension="${file##*.}"
newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_/\1\2/')
mv "$file" "$newfilename""_TIMING.jpg"
done
sed 's/\(.*\)_\(.*\)_/\1\2/')
supprime les _
de l'horodatage.
Par exemple:
user@Host$ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_230014_5335.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_231514_0814.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_233014_5706.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_234514_0896.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5395.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1145.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6047.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0547.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5492.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1264.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6146.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0658.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_230214_5630.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_20161018_231714_7135.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:30 .
user@Host$ find . -name "*.jpg" -type f -print0 | while read -d $'\0' file
> do
> newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_/\1\2/')
> mv $file $newfilename"_TIMING.jpg"
> done
10:35:20 t $ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182300145335_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182315140814_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182330145706_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182345140896_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182301145395_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182316141145_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182331146047_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182346140547_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182301145492_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182316141264_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182331146146_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182346140658_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182302145630_TIMING.jpg
-rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182317147135_TIMING.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:35 .
Vous avez probablement terminé, mais voici une solution (simple) toute bash
name__:
Est-ce que "simple ... bash solution" est un oxymoron?
#!/bin/bash
#loop through all files ending in .jpg
for f in *.jpg;
do
#cut out everything to the timestamp
firsthalf=${f%_*_*_*}
#get from the timestamp on
lasthalf=${f#*_*_}
#remove (all) underscores from timestamp
#note the 2 forward slashes...
lasthalf=${lasthalf//_/}
#get our extension
ext=${lasthalf##*.}
#now we can remove the extension
lasthalf=${lasthalf%.*}
#rename the file
#change `mv` to `echo` if you want to do a trial run first...
mv "$f" "${firsthalf}_${lasthalf}_TIMING.${ext}"
done;
PS: La logique de la boucle a été testée avec l'un de vos exemples de noms de fichiers. C'est passé.
Si vous pouviez utiliser l'interface graphique, je recommanderais pyRenamer.
Il est présent dans la plupart des distributions, f.i. dans Ubuntu:
Sudo apt-get install pyrenamer
Il peut faire tout ce que vous voulez et plus encore.
Voici votre brut intégréfind
+ xargs
+ sed
+ mv
oneliner (love oneliners):
find . -name "*.jpg" -print0 | sort -z | xargs -0 sh -c 'for filename; do mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g"); done' sh
Explication:
find . -name "*.jpg" | sort | xargs sh -c <command> sh
: liste tous les fichiers JPEG du répertoire actuel, puis exécute une commande Shell pour chacun d'eux (le tri est facultatif bien sûr, mais gardez les choses un peu plus propres si vous vous connectez quelque part)
-print0
, -z
, -0
: c'est une bonne habitude de séparer les éléments avec un binaire 0
lors de la symbolisation des noms de fichiers pour éviter les problèmes d'espaces au milieu (ce qui n'est pas votre cas)
mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");
: (les barres obliques inverses dans l'expression rationnelle de sed
ne facilitent pas sa lisibilité, mais il est simple) renommez chaque fichier en remplaçant la séquence soulignée de 8 + 6 + 4 chiffres par leur concaténation contiguë plus ce code _TIMING
thing (\i
est une référence arrière du groupe i
- ème regex).