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

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

Réponses:


26

Utilisation de l'expansion de l'historique bash :

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

où !#: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).


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.


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.


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

5

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.