Déplacer le fichier en ligne de commande avec un long chemin de répertoire sans répéter le chemin du répertoire


16

Existe-t-il un moyen d'exécuter une mvcommande sans taper le chemin complet dans le deuxième argument?

Exemple:

mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz


1
Une raison pour laquelle vous ne pouvez pas simplement accéder cdau répertoire et à mvpartir de là?
— zpletan

Je me retrouve fréquemment à exécuter ces types de commandes dans plusieurs répertoires dans mon travail quotidien. J'ai souvent besoin d'exécuter plusieurs commandes à partir d'un répertoire parent donné.
— Finbarr

D'une certaine manière, j'ai trouvé cela en utilisant !! (double signe d'exclamation) dans un terminal utilise pour exécuter la dernière commande exécutée. Vous pouvez également ajouter des paramètres / du texte à la dernière commande, mais vous n'avez jamais essayé de modifier / supprimer du texte de la dernière commande. Essayez-le et si vous réussissez, je laisserai tomber cela comme une réponse. Bonne chance!
— Geppettvs D'Constanzo

Réponses:


32

Vous pouvez utiliser l'extension d'accolade de bash. Cette:

mv my/file/that/has/a/really/long/path/foo.{bar,baz}

s'étendra à:

mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz

puis mvest exécuté avec ces deux arguments. Voir http://wiki.bash-hackers.org/syntax/expansion/brace pour plus d'informations sur l'expansion des accolades.


3
C'est glorieux. Je ne savais pas que tu pouvais faire ça.
— Finbarr

5

Comme alternative à l'expansion d'accolade, vous pouvez utiliser les fonctionnalités d' expansion de l'historique du shell bash :

  • ! introduit une extension de l'histoire
  • # désignateur d'événement désignant la commande en cours
  • $ désignateur de mot faisant référence au dernier argument

Vous pouvez effectuer des substitutions sur l'expansion en utilisant une s/pattern/replacementsyntaxe de type sed, par exemple

somecommand path/to/foo.bar !#$:s/.bar/.baz

Ex.

$ mv -v somepath/Original/Dir3/SubDir1/foo.bar !#$:s/.bar/.baz
mv -v somepath/Original/Dir3/SubDir1/foo.bar somepath/Original/Dir3/SubDir1/foo.baz
'somepath/Original/Dir3/SubDir1/foo.bar' -> 'somepath/Original/Dir3/SubDir1/foo.baz'

Si vous voulez spécifiquement le chemin (par exemple, vers mvun fichier avec un nom complètement différent qui n'est pas facilement obtenu par substitution), vous pouvez utiliser le hmodificateur:

$ mv -v somepath/Original/Dir3/SubDir1/foo.baz !#$:h/baz.foo
mv -v somepath/Original/Dir3/SubDir1/foo.baz somepath/Original/Dir3/SubDir1/baz.foo
'somepath/Original/Dir3/SubDir1/foo.baz' -> 'somepath/Original/Dir3/SubDir1/baz.foo'

Pour d'autres options, y compris readlinedes combinaisons de touches pour extraire le dernier argument, voir Comment répéter le paramètre actuellement tapé sur la console bash?


2

Vous pourriez essayer:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd

2

Avec une variable

  1. Enregistrez le répertoire dans une variable: `DIR=./really/long/path/
  2. utiliser déplacer: mv "$DIR"foo.bar "$DIR"foo.bz

En une seule ligne: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


Changer de répertoire

  1. Vous pouvez également cdaccéder au répertoire dans lequel vous souhaitez travailler:cd ./really/long/path
  2. puis changez le nom du fichier: mv foo.bar foo.bz

En une seule ligne: cd ./really/long/path && mv foo.bar foo.bz


1
cette seconde semble familière ;-)
— zpletan

2
Meilleure utilisation &&dans cette dernière doublure. Sinon, en cas d' cdéchec, le mvsera exécuté dans le mauvais répertoire, écrasant potentiellement un fichier. Avec cd ./really/long/path && mv foo.bar foo.baz, mvne sera exécuté que s'il cdréussit à changer de répertoire.
— geirha

-3

Vous pouvez vous alias commande pour abréger le nom du répertoire:

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst

1
-1 alias test='/var/log' ; cd testdonne -bash: cd: test: No such file or directory.
— zpletan
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.