pliki cp lub mv do tego samego katalogu, w którym już się znajdują, gdy jestem w innym?

12

Jeśli jestem ~/blobi mam plik~/blob/a_long_directory_name/c/x.x

mogę pisać

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

Czy jest jakiś skrót, w którym mogę wpisać coś krótszego, który używa ścieżki katalogu w pierwszym parametrze (choć nie w moim bieżącym katalogu), np.

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

gdzie coś takiego $same_dirwskazywałoby na reż. param 1

Michael Durrant
źródło

Odpowiedzi:

8

Aby zminimalizować ilość pisania, prawdopodobnie najłatwiej jest to zrobić w dwóch krokach. CD do katalogu, a następnie przenieś.

Jeśli masz tylko jedno polecenie, możesz użyć podpowłoki:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

Oznacza to, że cdzadziała tylko w podpowłoce, stanie się mvto tylko wtedy, gdy się cdpowiedzie, a katalog roboczy bieżącej powłoki się nie zmieni.

Jeśli masz więcej niż jedno polecenie, użyj stosu katalogów.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd
Alan Shutko
źródło
To nie odnosi się do even_moreścieżki względnej ...
Bezużyteczne
To jest poprawne. Przykład $ same_dir również go zignorował.
Alan Shutko
+1 mi się podoba. Bardzo łatwe do zapamiętania i zrobienia, a to dla mnie klucz
Michael Durrant,
Interesujące, ponieważ nie robi tego, o co prosiłeś. Może twoje pytanie nie jest dokładnie tym, co zamierzałeś?
Bezużyteczne
Bezużyteczne, zaktualizowałem swój tytuł, aby wyjaśnić, że chodzi o pliki cp / mv i trzymam je w tym samym katalogu, nawet jeśli jestem w innym. btw twoja nazwa użytkownika jest urocza, ale sprawia, że ​​komentarze wyglądają głupio, gdy są w nich użyte :)
Michael Durrant
5

Możesz użyć możliwości zamiany tekstu w powłoce. W bash, możesz użyć bestii, takiej jak:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

Aby to rozbić:

!# to aktualnie wpisana linia

:$prosi o wybranie ostatniego słowa (zamień go na liczbę, naby wybrać n„słowo) rozważanego ciągu ( !#w tym przypadku). Ostatnie słowo wpisanego do tej pory wiersza będzie poprzednim słowem.

:gs^xx^yywykonuje globalne ( g) zastępowanie tekstu ( s) w wynikowym słowie, zastępując „xx” słowem „yy”. ^jest tylko separatorem dla spolecenia pozwalającego na użycie /w twoich wzorcach.

Ta metoda jest nieco bardziej ogólna, ponieważ pozwala zastąpić dowolną część ścieżki („xx”) dowolnym innym słowem („yy”).

Wreszcie, podobnie jak przy każdej manipulacji historią, dobrze jest mieć ustawione odpowiednie opcje powłoki (np. In ~/.bashrc). W tym przypadku

shopt -s histverify

wyświetli edytowany wiersz po naciśnięciu klawisza return, dzięki czemu nadal możesz go edytować i sprawdzać, czy nie ma błędów.

Dlaczego nie używałbyś takiej konstrukcji, nie jestem pewien, ale w tym przypadku działa.

Wojtek
źródło
a) Zbyt dużo hałasu linii (w porównaniu do eleganckiej interpretacji nawiasów) b) nie rozwiązuje problemu PO za: chcą zastąpić c/x.xz evenmore/y.yzachowaniem oryginalnego przedrostek ścieżki.
Joseph R.
Twój drugi komentarz był z mojej strony prostym pominięciem, które wymagało prostej edycji, aby to naprawić. Nie rozumiem, jak ta odpowiedź zasługiwała na głosowanie. Dzięki edycji (technicznej) rozwiązuje problem i jest bardziej ogólny, ponieważ umożliwia zamianę dowolnej części ścieżki (często używałem czegoś podobnego $PWD). Jasne, może nie jest to najbardziej eleganckie, ale wskazuje na to, że shell ma substytuty tekstu i oznaczenia słów, które niektórzy użytkownicy mogą nadal uważać za przydatne do badania.
Wojtek
DOBRZE. Poprawiono mnie.
Joseph R.