W bash, jak mogę zmienić nazwę pliku bez powtarzania ścieżki? [duplikować]

39

Możliwa duplikat:
Użyj ponownie tekstu w poleceniu bash

Jeśli chcę zmienić nazwę pliku na kilka katalogów, jak mogę uniknąć powtarzania ścieżki?

Na przykład:

mv path/to/old_filename.txt path/to/new_filename.txt

Zastanawiam się, czy istnieje sposób, aby to zrobić:

mv path/to/old_filename.txt (?)new_filename.txt

Gdzie (?)można by powiedzieć „w tym samym katalogu”.

Nathan Long
źródło

Odpowiedzi:

26

Korzystanie z rozszerzenia historii bash :

mv path/to/oldfile !#:1:h/newfile

gdzie !#:1:hoznacza: z aktualnie wpisywanego wiersza („! #”), weź pierwsze słowo („: 1”), a następnie weź tylko składnik ścieżki („: h” - głowa).

Glenn Jackman
źródło
Jest to najbliższe temu, co zakładał pierwotny pytający, i może być przydatne, dlatego warto dać +1.
crazy2be
2
Fajne! Myślę, że metoda rozwijania nawiasów Dartha jest łatwiejsza, ale właśnie o to prosiłam.
Nathan Long
Nauczyłem się dzisiaj dwóch wielkich rzeczy. Ponadto na zawsze będę myśleć o rozszerzaniu nawiasów klamrowych jako „rozszerzaniu nawiasów Dartha”, ponieważ brzmi to niesamowicie.
PileOfMush
62

Możesz użyć rozszerzenia nawiasu klamrowego: mv path/to/{old_filename.txt,new_filename.txt}

Oto link do przewodnika GNU na temat rozwijania nawiasów w powłoce bash, który definiuje listę podstawień i każe bashowi powtarzać parametr za pomocą innego substytutu za każdym razem, gdy się powtarza.

Na przykład,

a{b,c,dd,e}

zostanie rozwinięty do

ab ac add ae

Jedynym zastrzeżeniem jest to, że rozszerzone powtórzenia muszą być w stanie podążać za sobą jako argumenty do programu docelowego.

Darth Android
źródło
5
Lub utrzymanie go do minimum: mv path/to/{old,new}_filename.txt. Pomaga to również w cofnięciu polecenia lub innym zbliżonym do powtórzenia poleceniu. Wielokrotnie to robiłem, np. mv /etc/X11/xorg.conf{,.backup}Będąc w stanie odwrócić proces za pomocą prostej zmiany mv /etc/X11/xorg.conf{.backup,}.
Daniel Andersson
26

Powyższa odpowiedź Dartha jest sprytna, ale jeśli chcesz zastosować podejście cd, możesz również rozważyć użycie podpowłoki:

(cd path/to && mv old_filename.txt new_filename.txt)

Ponieważ zmiana katalogu odbywa się w podpowłoce, tak naprawdę nie zmienisz katalogów w interaktywnej powłoce.

mlc
źródło
1
Istotna wada: Nie można używać uzupełniania tabulatorami dla old_filename.txt.
bluenote10,
9

Kolejna przydatna alternatywa, jeśli zamierzasz wykonać kilka poleceń w katalogu, to:

pushd /path/to
mv oldfile newfile
...
popd
KeithB
źródło
5

Podoba mi się odpowiedź @ Dartha . Oto alternatywa:cd path/to && mv oldfile newfile && cd -

Glenn Jackman
źródło
1
Uwaga: jeśli się mvnie powiedzie (np. Brak uprawnień), pozostaniesz w path/tokatalogu. Możesz spróbować cd path/to && mv oldfile newfile ; cd -upewnić się, że cd -jest zawsze uruchamiany, z wyjątkiem sytuacji, gdy cd path/to(brak uprawnień) nie powiedzie się, nadal będziesz wykonywać cd -i przejść do poprzedniego katalogu, który jest niepożądany. Odpowiedź podpowłoki mlc (+1) jest lepsza. Wydaje mi się, że cd . && cd path/to && mv oldfile newfile ; cd -zadziałałoby 99,9% czasu (z cd .niepowodzeniem tylko wtedy, gdy zmienił się ty lub twoje obecne katalogi; w takim przypadku przejście do innego
katalogu