Zmień katalog na cel operacji przenoszenia

12

Czasami edytowałem jakiś plik i chcę przenieść go do innego folderu. (Zwykle: do folderu Dropbox, w którym nie chciałem pracować, aby uniknąć ciągłego aktualizowania innych właścicieli folderu). Robię to na przykład za pomocą

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

Potem często chcę zmienić katalog na katalog docelowy mojej poprzedniej operacji przenoszenia. Uderzam w strzałkę w górę, usuwam finał file.pdf, trzymam lewy, kasuję mv file.pdfi zastępuję go cd.

Czy jest na to szybszy i mądrzejszy sposób? Czy istnieje polecenie „przenieś plik, a następnie zmień katalog na” lub skrót do ostatnio używanego katalogu lub coś w tym rodzaju?

Mees de Vries
źródło
1
jeśli przytrzymasz CTRL + w lewo, słowo będzie szybciej w lewo
cat
Komentarz boczny, a nie odpowiedź na twoje pytanie dotyczące powłoki: zazwyczaj wstrzymuję Dropbox podczas edycji. Zapewnia również, że żadne inne pliki nie zostaną zmienione „pod moimi stopami”.
Constantino Tsarouhas

Odpowiedzi:

17

Jeśli używasz bash, jego interakcja z historią ma tylko skrót do tego. Desygnator słowo za ostatni argument poprzedniego polecenia:

!!:$
wyznacza ostatni argument poprzedniego polecenia. Można to skrócić !$.

W połączeniu z modyfikatorem, aby usunąć ostatni składnik nazwy ścieżki:

Po opcjonalnym desygnatorze słowa możesz dodać sekwencję jednego lub więcej poprawnych modyfikatorów , każdy poprzedzony znakiem „:”.

h
Usuń końcowy składnik nazwy ścieżki, pozostawiając tylko głowę.

Więc:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

Tego samego skrótu można także użyć w Zsh.

muru
źródło
1
To jest takie fajne.
Starszy Geek
4

Jeśli nie zmieniasz nazwy pliku, możesz go pominąć, a mv doda go automatycznie; jest to szczególnie przydatne podczas przenoszenia wielu plików:

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

Z katalogiem jako ostatnim argumentem możesz użyć !!:$lub, !$jak opisuje odpowiedź muru.
Jeśli używasz bash ze zwykłymi ustawieniami domyślnymi, możesz zamiast tego użyć Alt+ ..
(Jest to insert-last-argumentpolecenie readline ; bind -pwyświetli listę wszystkich twoich bieżących powiązań).

deltab
źródło
1
zwróć uwagę, że pominięcie docelowej nazwy pliku może po cichu zastąpić docelowy plik, jeśli już istnieje
cat
mvzawsze nadpisuje pliki docelowe w ciszy, chyba że określisz opcje -i/ --interactivelub -n/ --no-clobber. Właśnie dlatego mam alias mv='mv -i' cp='cp -i'w sobie .bashrc.
David Foerster
-1

Innym podejściem jest utworzenie własnego polecenia przeznaczonego do tego celu. Można to zrobić za pomocą funkcji, która może wyglądać następująco:

$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }

Gdzie: (1) mv-special jest nazwą funkcji; (2) zmienne $1i $2argumenty w funkcji, które będą używane przez komendy mvi cd; (3) $(echo $2-) dodaje znak wildcat na końcu łańcucha w var $2i naprawia zachowanie, dirnamejeśli zmienna $2zawiera tylko ścieżkę; (4) $(dirname $(echo $2-)) odfiltruje tylko ścieżkę $2.

Zgodnie z tą odpowiedzią funkcja może wyglądać następująco:

$ function mv-special { mv $1 $2; cd ${2%/*}; }

Gdzie: ${2%/*}odfiltruje tylko ścieżkę $2.

Aby funkcja ta była dostępna jako polecenie, należy ją wyeksportować :

$ export -f mv-special

Stosowanie:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

lub:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

Proszę zwrócić uwagę, że - dla obu wariantów - drugi argument ( $2) musi kończyć się nazwą pliku lub ukośnikiem ( /).

Aby nasze nowe polecenie było stale dostępne, do funkcji należy dołączyć definicję funkcji i polecenie eksportu ~/.bashrc:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

lub:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd ${2%/*}; }
export -f mv-special

wprowadź opis zdjęcia tutaj


Niestandardowe polecenie można wykonać za pomocą wykonywalnego pliku skryptu, który jest umieszczony w ~/binlub w /usr/sbin: Jak mogę utworzyć niestandardowe polecenie terminala (w celu uruchomienia skryptu)? Ale szczerze mówiąc, miałem problem z zachowaniem się cdw tym scenariuszu.

pa4080
źródło