Czy jest jakiś sposób wykonania mvpolecenia bez wpisania pełnej ścieżki w drugim argumencie?
Przykład:
mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz
Czy jest jakiś sposób wykonania mvpolecenia bez wpisania pełnej ścieżki w drugim argumencie?
Przykład:
mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz
Odpowiedzi:
Możesz użyć rozszerzenia nawiasu klamrowego bash. To:
mv my/file/that/has/a/really/long/path/foo.{bar,baz}
rozwinie się w:
mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz
a następnie mvjest uruchamiany z tymi dwoma argumentami. Zobacz http://wiki.bash-hackers.org/syntax/expansion/brace, aby uzyskać więcej informacji na temat rozwijania nawiasów klamrowych.
Jako alternatywę dla rozszerzenia nawiasów klamrowych możesz użyć funkcji rozszerzenia historii powłoki bash :
! wprowadza rozszerzenie historii# oznaczenie zdarzenia oznaczające bieżące polecenie$ desygnator słowa odnoszący się do ostatniego argumentu Możesz wykonać podstawienia w rozwinięciu, używając s/pattern/replacementskładni podobnej do sed, np
somecommand path/to/foo.bar !#$:s/.bar/.baz
Dawny.
$ 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'
Jeśli chcesz konkretnie ścieżkę (na przykład do mvpliku o zupełnie innej nazwie, której nie można łatwo uzyskać przez podstawienie), możesz użyć hmodyfikatora:
$ 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'
Aby readlinezapoznać się z innymi opcjami, w tym kombinacjami klawiszy umożliwiającymi wyrwanie ostatniego argumentu, zobacz Jak powtórzyć aktualnie wpisany parametr w konsoli bash?
`DIR=./really/long/path/mv "$DIR"foo.bar "$DIR"foo.bzW jednej linii: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz
cdprzejść do katalogu, w którym chcesz pracować:cd ./really/long/pathmv foo.bar foo.bzW jednej linii: cd ./really/long/path && mv foo.bar foo.bz
&&w ostatniej linijce. W przeciwnym razie, jeśli się cdnie powiedzie, mvzostanie uruchomiony w niewłaściwym katalogu, potencjalnie nadpisując plik. Z cd ./really/long/path && mv foo.bar foo.baz, mvzostanie uruchomiony tylko wtedy, gdy cduda się zmienić katalog.
cdprzejść do katalogu, amvstamtąd?