Befehlszeilenverschiebungsdatei mit langem Verzeichnispfad, ohne den Verzeichnispfad zu wiederholen

16

Gibt es eine Möglichkeit, einen mvBefehl auszuführen, ohne den vollständigen Pfad im zweiten Argument einzugeben?

Beispiel:

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

Finbarr
quelle
1
Gibt es einen Grund, warum du nicht einfach cdin das Verzeichnis und mvvon dort aus?
Zpletan
In meiner täglichen Arbeit führe ich solche Befehle häufig in mehreren Verzeichnissen aus. Ich muss oft mehrere Befehle aus einem bestimmten übergeordneten Verzeichnis ausführen.
Finbarr
Irgendwie fand ich das mit !! (doppelte Ausrufezeichen) in einem Terminal wird verwendet, um den zuletzt ausgeführten Befehl auszuführen. Sie können dem letzten Befehl auch Parameter / Text hinzufügen, haben jedoch nie versucht, Text aus dem letzten Befehl zu ändern / zu entfernen. Probieren Sie es aus und wenn Sie Erfolg haben, werde ich dies wie eine Antwort fallen lassen. Viel Glück!
Geppettvs D'Constanzo

Antworten:

32

Sie können die Klammererweiterung von bash verwenden. Dies:

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

wird erweitert in:

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

und dann mvwird mit diesen beiden Argumenten ausgeführt. Weitere Informationen zur Klammererweiterung finden Sie unter http://wiki.bash-hackers.org/syntax/expansion/brace .

geirha
quelle
3
Das ist herrlich. Ich wusste nicht, dass du das kannst.
Finbarr
5

Als Alternative zur geschweiften Erweiterung können Sie die History-Erweiterungsfunktionen der Bash-Shell verwenden :

  • ! führt eine Historienerweiterung ein
  • # Ereignisbezeichner, der den aktuellen Befehl angibt
  • $ Wortbezeichner, der sich auf das letzte Argument bezieht

Sie können die Erweiterung mit einer sed-ähnlichen s/pattern/replacementSyntax ersetzen, z

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'

Wenn Sie den Pfad speziell festlegen möchten (z. B. zu mveiner Datei mit einem völlig anderen Namen, der nicht einfach durch Ersetzen abgerufen werden kann), können Sie den hModifikator verwenden:

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

Weitere Optionen, einschließlich readlineTastenkombinationen zum Ziehen des letzten Arguments, finden Sie unter Wiederholen der aktuell in der Bash-Konsole eingegebenen Parameter.

Stahlfahrer
quelle
2

Sie könnten versuchen:

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

Mit einer Variablen

  1. Speichern Sie das Verzeichnis in einer Variablen: `DIR=./really/long/path/
  2. benutze move: mv "$DIR"foo.bar "$DIR"foo.bz

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


Verzeichnis wechseln

  1. Sie können auch cdin das Verzeichnis wechseln, in dem Sie arbeiten möchten:cd ./really/long/path
  2. dann ändere den Dateinamen: mv foo.bar foo.bz

In einer Zeile: cd ./really/long/path && mv foo.bar foo.bz

danjjl
quelle
1
das zweite kommt
mir
2
Am besten &&in diesem letzten Einzeiler verwenden. Andernfalls wird das cdProgramm mvim falschen Verzeichnis ausgeführt und möglicherweise eine Datei überschrieben. Mit cd ./really/long/path && mv foo.bar foo.baz, mvwird nur ausgeführt, wenn der cdVerzeichniswechsel erfolgreich ist.
Geirha
-3

Sie können den Alias-Befehl verwenden, um den Verzeichnisnamen zu verkürzen:

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst
Shantanu
quelle
1
-1 alias test='/var/log' ; cd testgibt -bash: cd: test: No such file or directory.
Zpletan