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


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 .


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.


2

Sie könnten versuchen:

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

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


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

1
-1 alias test='/var/log' ; cd testgibt -bash: cd: test: No such file or directory.
Zpletan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.