Sous Linux, je renomme parfois des fichiers comme celui-ci:
mv dir1/dir2/dir3/file.txt dir1/dir2/dir3/file.txt.old
Notez que je veux simplement renommer le fichier, pas le déplacer vers un autre répertoire.
Existe-t-il une commande qui me permettrait de faire une version abrégée de cette commande? Je pense à quelque chose comme:
mv dir1/dir2/dir3/file.txt file.txt.old
ou peut-être même quelque chose comme (pour simplement ajouter au nom):
mv dir1/dir2/dir3/file.txt {}.old
Mon objectif n'est pas de devoir spécifier à nouveau le chemin complet.
Je sais que les "exemples" que j'ai écrits ne fonctionnent pas, mais ce n'est qu'une idée de ce que je veux accomplir.
Je ne veux pas avoir à entrer dans le répertoire.
linux
filesystems
files
mv
Santiago arizti
la source
la source
(cd dir1/dir2/dir3 && exec mv file.txt{,.old})
a effectivement les mêmes performances que le code sans le sous-processus, car celaexec
évite l'fork()
ing lors de l'appel de commande externe, vous avez donc exactement une fourchette dans les deux sens.Réponses:
pour un seul fichier, essayez
où la
X{a,b}
construction s'étendXa Xb
, vous pouvez avoir un aperçu en utilisantpour voir si cela correspond à vos besoins.
Remarque:
que pour plusieurs fichiers
est peu susceptible de s'étendre à ce que vous voulez. (cela s'étendra à un mélange de fichier.txt fichier1.txt.old fichier2.txt ...)
{txt,txt.old}
peut être raccourci{,.old}
selon le commentairesi le nom du répertoire n'est pas ambigu, le caractère générique peut être utilisé.
pour plusieurs fichiers
rename
drop
-n
pour avoir un renommage efficace.la source
mv dir1/dir2/dir3/file.txt{,.old}
pas aussi et serait encore plus court?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, elle ne renommera alors que ce seul fichier. Pour plus de détails et de la syntaxe spécifique distro s'il vous plaît lire la page de manuel:man rename
.Exemple d'utilisation: renommez "/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):
Pour une utilisation à sec
rename -n
.Plus d'exemples et de détails peuvent être trouvés sur https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
la source
rename
commandes différentes avec un comportement complètement différent..old
au nom de fichier, il est probablement un peu plus pratique de faire unrename 's/$/.old/' /path/to/file.txt
ourename '$_.=".old"' /path/to/file.txt
Pour un cas unique, si je ne veux pas changer mon répertoire actuel, je pourrais simplement utiliser un sous-shell:
Parce que vous
cd
à l'intérieur du sous-shell, vous n'avez pas changé votre répertoire dans votre shell réella source
&& exec mv
- de cette façon, vous n'essayez pas de renommer en cas d'cd
échec, et leexec
consomme le sous-shell, évitant ainsi une pénalité de performance.&&
Pour un cas unique, comme je l'ai dit, je ne m'inquiéterais pas du coût du sous-shell (restez simple: pouvoir se rappeler facilement comment le faire est plus important OMI)J'aime la solution de @ archemar d'utiliser l'expansion {}, car vous pouvez l'utiliser lorsque vous avez déjà démarré votre ligne de commande. Voici quelques autres possibilités d'exhaustivité:
(les guillemets ne sont nécessaires que si vous avez des espaces ou d'autres caractères de rupture de mot dans le nom)
Remarques:
mymv
peut être n'importe quelle chaîne raisonnable, j'ai utilisé mymv pour "mon déménagement".Un autre:
mais
(de @Adam et @CharlesDuffy) est sans doute mieux en cas d'échec du cd.
la source
mmv
, il existe déjà un programme nommé de cette façon.Si vous souhaitez entrer dans le sous-répertoire afin de raccourcir la
mv
commande, mais souhaitez revenir au répertoire en cours par la suite, il existe deux façons de procéder. L'une consiste à mettre lecd
etmv
dans une sous-coque (comme cela a déjà été suggéré).L'autre consiste à utiliser
pushd
etpopd
à changer de répertoire:La
pushd
commande est similairecd
, sauf qu'elle pousse d'abord le nom du répertoire courant sur une pile.popd
supprime le premier nom de la pile et modifie ce répertoire.la source
pushd
etpopd
sont des extensions destinées à une utilisation interactive - POSIX les répertorie explicitement comme "les résultats ne sont pas spécifiés", et un shell conçu pour exécuter des scripts (c'est-à-dire sur un environnement embarqué minimal) n'a pas besoin de les prendre en charge.Je ferais juste
la source
La solution impliquant:
mv something{.txt,.txt.old}
utilise un "bashisme". Si vous voulez un moyen plus portable, en utilisant des manipulations de variables courantes:la source
${var/text/replacement}
est un bashisme lui-même.