#1 Le 12/04/2020, à 21:42
- ptafflogic
Déplacer et renommer plusieurs fichiers en ligne de commande/script
Bonjour,
J'essaie par pur défi de trouver le moyen de déplacer en ligne de commande plusieurs fichiers d'un dossier à un autre en renommant automatiquement les fichiers avec un nom identique. Un peu comme Dolphin le fait ("Cocher "Renommer" + Appliquer à tous"). J'ai lu sur mv, cp, find, etc. mais je ne sais pas comment formuler exactement ma recherche pour trouver ce que je veux.
Exemple: fichier-1.txt du dossier source est renommé fichier-1(1).txt dans la destination si fichier-1.txt existe déjà. Si fichier-1(1).txt existe déjà dans la destination, il faut renommer le fichier-1.txt en fichier-1(2).txt et ainsi de suite.
Est-ce que cela se fait en une seule commande? Dois-je créer un script?
Merci!
P.
Hors ligne
#2 Le 12/04/2020, à 22:17
- MicP
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
Bonsoir
Avec les commandes mv et cp il est possible d'utiliser l'option backup
(voir la page man des commandes cp et mv)
Voici un petit exemple de ce que ça donne :
michel@debT450:~/tstCp$ touch fichier-1.txt
michel@debT450:~/tstCp$ mkdir sousRep
michel@debT450:~/tstCp$
michel@debT450:~/tstCp$ cp fichier-1.txt sousRep/
michel@debT450:~/tstCp$ ls -l sousRep/
total 0
-rw-r--r-- 1 michel michel 0 avril 12 23:14 fichier-1.txt
michel@debT450:~/tstCp$
michel@debT450:~/tstCp$ cp --backup=numbered fichier-1.txt sousRep/
michel@debT450:~/tstCp$ ls -l sousRep/
total 0
-rw-r--r-- 1 michel michel 0 avril 12 23:14 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 12 23:14 fichier-1.txt.~1~
michel@debT450:~/tstCp$
michel@debT450:~/tstCp$ cp --backup=numbered fichier-1.txt sousRep/
michel@debT450:~/tstCp$ ls -l sousRep/
total 0
-rw-r--r-- 1 michel michel 0 avril 12 23:14 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 12 23:14 fichier-1.txt.~1~
-rw-r--r-- 1 michel michel 0 avril 12 23:14 fichier-1.txt.~2~
michel@debT450:~/tstCp$
Dernière modification par MicP (Le 12/04/2020, à 22:19)
Hors ligne
#3 Le 12/04/2020, à 23:10
- kamaris
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
Oui, cp ou mv font l'essentiel du travail, par contre ça n'est pas très souple pour le format du suffixe (rsync n'a pas l'air de proposer mieux).
Pour parvenir au format que demande ptafflogic, j'ai l'impression que le plus simple est de faire ce que propose MicP, puis de passer par un rename :
rename 's/(.*)\.(.*)\.~([0-9]+)~/\1(\3).\2/' sousRep/*
Dernière modification par kamaris (Le 12/04/2020, à 23:14)
En ligne
#4 Le 13/04/2020, à 00:19
- ptafflogic
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
Rebonjour,
Globalement, je comprends vos deux solutions. Celle de MicP donne des "backups", lesquels sont des fichiers cachés, et celle de kamaris renomme lesdits backups dans le format demandé. Merci!
Cependant, la solution de MicP fonctionne pour 1 fichier. Comment intégrer les 2 solutions pour un grand ensemble de fichiers dans une seule commande?
Merci encore,
P.
Hors ligne
#5 Le 13/04/2020, à 00:34
- kamaris
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
Non, ce que propose MicP a toute la puissance de cp ou mv (dont la copie multiple), c'est bien pour ça que je dis que c'est probablement le plus simple de faire d'abord ça, puis de renommer en masse par rename.
Autre remarque : les fichiers de backup ne sont pas des fichiers cachés (ils ne commencent pas par « . », à moins que ça ne soit déjà le cas du fichier d'origine).
En ligne
#6 Le 13/04/2020, à 00:34
- Watael
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
ce ne sont pas des fichiers cachés : le nom des fichiers cachés commence par un point.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 13/04/2020, à 06:31
- MicP
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
Bonjour
michel@debT450:~/tstCp$ ls -l
total 0
michel@debT450:~/tstCp$ touch fichier-{1..3}.txt
michel@debT450:~/tstCp$ mkdir sousRep
michel@debT450:~/tstCp$ ls -lR
.:
total 4
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-2.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-3.txt
drwxr-xr-x 2 michel michel 4096 avril 13 07:19 sousRep
./sousRep:
total 0
michel@debT450:~/tstCp$
michel@debT450:~/tstCp$ cp fichier-*.txt sousRep/
michel@debT450:~/tstCp$ ls -lR
.:
total 4
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-2.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-3.txt
drwxr-xr-x 2 michel michel 4096 avril 13 07:19 sousRep
./sousRep:
total 0
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-2.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-3.txt
michel@debT450:~/tstCp$
michel@debT450:~/tstCp$ cp --backup=numbered fichier-*.txt sousRep/
michel@debT450:~/tstCp$ ls -lR
.:
total 4
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-2.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-3.txt
drwxr-xr-x 2 michel michel 4096 avril 13 07:19 sousRep
./sousRep:
total 0
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-1.txt.~1~
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-2.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-2.txt.~1~
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-3.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-3.txt.~1~
michel@debT450:~/tstCp$
michel@debT450:~/tstCp$ rename 's/(.*)\.(.*)\.~([0-9]+)~/$1($3).$2/' sousRep/*
michel@debT450:~/tstCp$ ls -lR
.:
total 4
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-2.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-3.txt
drwxr-xr-x 2 michel michel 4096 avril 13 07:20 sousRep
./sousRep:
total 0
-rw-r--r-- 1 michel michel 0 avril 13 07:19 'fichier-1(1).txt'
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-1.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 'fichier-2(1).txt'
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-2.txt
-rw-r--r-- 1 michel michel 0 avril 13 07:19 'fichier-3(1).txt'
-rw-r--r-- 1 michel michel 0 avril 13 07:19 fichier-3.txt
michel@debT450:~/tstCp$
Hors ligne
#8 Le 13/04/2020, à 08:01
- ptafflogic
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
Rebonjour,
Merci kamaris et MicP pour vos réponses. Ça fonctionne et je peux combiner les deux commandes avec &&. Il y a seulement un petit problème: si un fichier-1(1).txt existe déjà, rename ne renommera pas car le fichier existe déjà.
@Watael: Je sais que les fichiers cachés commencent par un "." Cependant, dans le gestionnaire de fichiers Nemo, ils sont cachés et je dois utiliser "Ctrl+H" pour les afficher.
P.
Dernière modification par ptafflogic (Le 13/04/2020, à 08:10)
Hors ligne
#9 Le 13/04/2020, à 14:06
- Watael
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
nemo assimile les fichiers archives (généralement indiqués par un tilde final) à des fichiers cachés, soit.
mais nemo ne s'utilise pas dans le terminal.
restons dans le contexte.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 13/04/2020, à 16:29
- kamaris
Re : Déplacer et renommer plusieurs fichiers en ligne de commande/script
Il y a seulement un petit problème: si un fichier-1(1).txt existe déjà, rename ne renommera pas car le fichier existe déjà.
Il faut préparer le répertoire cible par la commande rename « inverse » avant la création des fichiers de backup par cp :
rename 's/(.*)\(([0-9]+)\)\.(.*)/\1.\3.~\2~/' sousRep/*
En ligne