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

Finbarr
la source
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.

geirha
la source
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?

tournevis
la source
2

Vous pourriez essayer:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd
zpletan
la source
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

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