File di spostamento della riga di comando con percorso directory lungo senza ripetere il percorso directory


16

Esiste un modo per eseguire un mvcomando senza digitare il percorso completo nel secondo argomento?

Esempio:

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


1
Qualche motivo per cui non puoi semplicemente cdaccedere alla directory e mvda lì?
zpletan,

Spesso mi trovo a eseguire questo tipo di comandi in più directory nel mio lavoro quotidiano. Ho spesso bisogno di eseguire diversi comandi da una determinata directory principale.
Finbarr,

In qualche modo ho scoperto che usando !! (doppi punti esclamativi) in un terminale utilizza per eseguire l'ultimo comando eseguito. Puoi anche aggiungere parametri / testo all'ultimo comando ma non hai mai provato a cambiare / rimuovere il testo dall'ultimo comando. Provalo e se ci riesci lascerò cadere questo come una risposta. In bocca al lupo!
Geppettvs D'Constanzo,

Risposte:


32

Puoi usare l'espansione del rinforzo di bash. Questo:

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

si espanderà in:

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

e quindi mvviene eseguito con questi due argomenti. Vedi http://wiki.bash-hackers.org/syntax/expansion/brace per ulteriori informazioni sull'espansione del controvento.


3
È glorioso. Non sapevo che potessi farlo.
Finbarr,

5

In alternativa all'espansione del controvento, è possibile utilizzare le funzionalità di espansione della cronologia della shell bash :

  • ! introduce un'espansione della storia
  • # designatore di eventi che indica il comando corrente
  • $ designatore di parole riferito all'ultimo argomento

È possibile eseguire sostituzioni sull'espansione usando una s/pattern/replacementsintassi simile a sed ad es

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'

Se si desidera specificamente il percorso (ad esempio, a mvun file con un nome completamente diverso che non è facilmente ottenibile per sostituzione), è possibile utilizzare il hmodificatore:

$ 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'

Per le altre opzioni, tra cui readlinecombinazioni di tasti per Yank l'ultimo argomento, vedere come ripetere attualmente digitato parametro su console bash?


2

Potresti provare:

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

2

Con una variabile

  1. Salvare la directory in una variabile: `DIR=./really/long/path/
  2. usa mossa: mv "$DIR"foo.bar "$DIR"foo.bz

In una riga: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


Cambiare directory

  1. Puoi anche cdaccedere alla directory in cui vuoi lavorare:cd ./really/long/path
  2. quindi cambia il nome del file: mv foo.bar foo.bz

In una riga: cd ./really/long/path && mv foo.bar foo.bz


1
quella seconda sembra familiare ;-)
zpletan,

2
Il miglior uso &&in quell'ultimo one-liner. Altrimenti, se cdfallisce, mvverrà eseguito nella directory sbagliata, sovrascrivendo potenzialmente un file. Con cd ./really/long/path && mv foo.bar foo.baz, mvverrà eseguito solo se cdriesce a cambiare directory.
Geirha,

-3

È possibile alias comando per abbreviare il nome della directory:

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

1
-1 alias test='/var/log' ; cd test-bash: cd: test: No such file or directory.
zpletan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.