Solution 1 :
pour un seul fichier essayez
mv dir1/dir2/dir3/file.{txt,txt.old}
où le X{a,b}
construire étendre à Xa Xb
, vous pouvez avoir un aperçu en utilisant
echo dir1/dir2/dir3/file.{txt,txt.old}
pour voir si cela correspond à vos besoins.
remarque :
-
cela pour plusieurs fichiers
mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
est peu susceptible de s'étendre à ce que vous voulez. (cela se développera en un mélange de file.txt file1.txt.old file2.txt ...)
-
{txt,txt.old}
peut être raccourci à{,.old}
selon le commentaire -
si le nom du répertoire est sans ambiguïté, un caractère générique peut être utilisé.
mv *1/*2/d*/*.{,old}
pour plusieurs fichiers, utilisez rename
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
supprimer -n
pour avoir un renommage effectif.
Solution 2 :
La commande rename
renomme tous les fichiers correspondants. Son objectif principal est de renommer plusieurs fichiers, mais si l'expression Perl ne correspond qu'à un seul fichier, alors elle ne renommera que ce seul fichier. Pour plus de détails et une syntaxe spécifique à la distribution, veuillez lire la page de manuel :man rename
.
Exemple d'utilisation :renommer "/path/file.txt" en "/path/file.txt.old":
rename 's/file.txt/file.txt.old/g' /path/file.txt
Notation plus courte (grâce à shalomb) :
rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt
Pour un essai à blanc, utilisez rename -n
.
Plus d'exemples et de détails peuvent être trouvés sur https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
Solution 3 :
J'aime la solution de @archemar consistant à utiliser l'extension {}, car vous pouvez l'utiliser lorsque vous avez déjà démarré votre ligne de commande. Voici quelques autres possibilités d'exhaustivité :
F="dir1/dir2/dir3/file.txt" ; mv "$F" "$F.old"
(les guillemets ne sont nécessaires que si vous avez des espaces ou d'autres caractères de césure dans le nom)
mymv() {
mv "$1/$2" "$1/$3"
}
mymv dir1/dir2/dir3 file.txt file.txt.old
mymv dir5/dir6/dir7 file.txt file.txt.old
Remarques :
- C'est la syntaxe bash, vous utilisez peut-être un autre shell
mymv
peut être n'importe quelle chaîne raisonnable, j'ai utilisé mymv pour "mon coup".- La définition de la fonction peut être placée dans votre .bash_profile
Un autre :
cd dir1/dir2/dir3 ; mv file.txt file.txt.old ; cd -
mais
(cd dir1/dir2/dir3/ && exec mv file.txt file.txt.old)
(de @Adam et @CharlesDuffy) est sans doute mieux en cas d'échec du cd.
Solution 4 :
Pour un cas ponctuel, si je ne veux pas changer mon répertoire actuel, je peux simplement utiliser un sous-shell :
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
Parce que vous cd
à l'intérieur du sous-shell, vous n'avez pas changé de répertoire dans votre shell actuel
Solution 5 :
Si vous souhaitez entrer dans le sous-répertoire afin de raccourcir le mv
commande, mais que vous souhaitez revenir au répertoire en cours par la suite, il existe deux façons de procéder. L'une consiste à mettre le cd
et mv
dans un sous-shell (comme cela a déjà été suggéré).
L'autre consiste à utiliser pushd
et popd
pour changer de répertoire :
pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd
Lepushd
la commande est comme cd
, sauf qu'il place d'abord le nom du répertoire courant sur une pile. popd
supprime le nom supérieur de la pile et passe dans ce répertoire.