Gibt es eine Möglichkeit, einen mv
Befehl 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
Gibt es eine Möglichkeit, einen mv
Befehl 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
Antworten:
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 mv
wird mit diesen beiden Argumenten ausgeführt. Weitere Informationen zur Klammererweiterung finden Sie unter http://wiki.bash-hackers.org/syntax/expansion/brace .
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/replacement
Syntax 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 mv
einer Datei mit einem völlig anderen Namen, der nicht einfach durch Ersetzen abgerufen werden kann), können Sie den h
Modifikator 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 readline
Tastenkombinationen zum Ziehen des letzten Arguments, finden Sie unter Wiederholen der aktuell in der Bash-Konsole eingegebenen Parameter.
`DIR=./really/long/path/
mv "$DIR"foo.bar "$DIR"foo.bz
In einer Zeile: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz
cd
in das Verzeichnis wechseln, in dem Sie arbeiten möchten:cd ./really/long/path
mv foo.bar foo.bz
In einer Zeile: cd ./really/long/path && mv foo.bar foo.bz
&&
in diesem letzten Einzeiler verwenden. Andernfalls wird das cd
Programm mv
im falschen Verzeichnis ausgeführt und möglicherweise eine Datei überschrieben. Mit cd ./really/long/path && mv foo.bar foo.baz
, mv
wird nur ausgeführt, wenn der cd
Verzeichniswechsel erfolgreich ist.
cd
in das Verzeichnis undmv
von dort aus?