Sous bash, comment puis-je renommer un fichier sans répéter le chemin? [dupliquer]

39

Dupliquer possible:
réutiliser du texte sur une commande bash

Si je veux renommer un fichier sur quelques répertoires, comment éviter de répéter le chemin?

Par exemple:

mv path/to/old_filename.txt path/to/new_filename.txt

Je me demande s'il y a un moyen de faire cela:

mv path/to/old_filename.txt (?)new_filename.txt

(?)serait un moyen de dire "dans le même répertoire."

Nathan Long
la source

Réponses:

26

Utilisation de l'expansion de l'historique bash :

mv path/to/oldfile !#:1:h/newfile

!#:1:hsignifie: dans la ligne que vous êtes en train de taper ("! #"), prenez le premier mot (": 1"), puis prenez uniquement le composant de chemin (": h" - la tête).

Glenn Jackman
la source
Ceci est le plus proche de ce que le questionneur initial supposait que la solution pourrait être, et il est utile de le savoir, donc +1.
Crazy2be
2
Cool! Je pense que la méthode d'expansion de Darth est plus facile, mais c'est exactement ce que j'ai demandé.
Nathan Long
J'ai appris deux grandes choses nouvelles aujourd'hui. De plus, je penserai toujours à l'expansion du corset comme étant "le corset de Darth" parce que ça a l'air génial.
PileOfMush le
62

Vous pouvez utiliser l’extension d’attelle: mv path/to/{old_filename.txt,new_filename.txt}

Voici un lien vers le guide GNU sur le développement d'accolades dans le shell bash, qui définit une liste de substituts et indique à bash de répéter le paramètre en utilisant un substitut différent chaque fois qu'il se répète.

Par exemple,

a{b,c,dd,e}

sera étendu à

ab ac add ae

Le seul inconvénient est que les répétitions étendues doivent pouvoir se suivre en tant qu'arguments du programme cible.

Darth Android
la source
5
Ou le garder au minimum: mv path/to/{old,new}_filename.txt. Cela facilite également l’inversion ou d’autres types de répétition proche de la commande. J'ai souvent fait, par exemple mv /etc/X11/xorg.conf{,.backup}, être capable d'inverser le processus par le simple changement mv /etc/X11/xorg.conf{.backup,}.
Daniel Andersson
26

La réponse de Darth ci-dessus est intelligente, mais si vous souhaitez utiliser une approche avec cd, vous pouvez également envisager d'utiliser un sous-shell:

(cd path/to && mv old_filename.txt new_filename.txt)

Comme le changement de répertoire a lieu dans le sous-shell, vous ne changerez pas de répertoire dans votre shell interactif.

mlc
la source
1
Inconvénient important: vous ne pouvez pas utiliser la complétion par tabulation pour old_filename.txt.
Bluenote10
9

Une autre alternative utile, si vous allez effectuer plusieurs commandes dans le répertoire, est la suivante:

pushd /path/to
mv oldfile newfile
...
popd
KeithB
la source
5

J'aime la réponse de @ Darth . Voici une alternative:cd path/to && mv oldfile newfile && cd -

Glenn Jackman
la source
1
Remarque En cas d' mvéchec (par exemple, sans autorisation), vous resterez dans le path/torépertoire. Vous pouvez essayer cd path/to && mv oldfile newfile ; cd -de vous assurer que le programme cd -est toujours exécuté, sauf si cd path/to(aucune autorisation) échoue, vous continuerez à vous exécuter cd -et à accéder au répertoire précédent non souhaité. mlc (+1) la réponse du sous-shell est meilleure. Je suppose que cd . && cd path/to && mv oldfile newfile ; cd -cela marcherait 99,9% du temps (avec cd .un échec seulement si vous ou vos autorisations de répertoires actuelles changeaient; et dans ce cas, passer à un
répertoire différent n’aurait