Czy jest jakiś sprytny sposób, aby zrobić kopię i przenieść czynności lub polecenia do kopiowania pliku, bez konieczności zrobić cd
, to mv
później, w tym samym folderze?
Na przykład muszę uruchomić następujące czynności:
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
Zauważ, że katalog, do którego przenoszę plik, jest taki sam, ale muszę ponownie podać całą ścieżkę, a czasem robi się to denerwujące. Jestem ciekawy, czy istnieje inny sposób, aby to zrobić bez konieczności ponownego wprowadzania całej ścieżki , ponieważ operacja zostałaby wykonana na tej samej ścieżce.
Odpowiedzi:
Wystarczy użyć rozszerzenia nawiasu klamrowego :
Jest to równoważne z pisaniem:
Rozwijanie nawiasów pozwala oczywiście podać więcej argumentów. Można nawet podać zakresy do niej, na przykład, aby utworzyć kilka folderów testowych, można uruchomić
mkdir test_{a..z}
, a wychodząc z Bash 4, można tworzyć sekwencje zero-wyściełane, a także, jak wtouch foo{0001..3}
, który tworzyfoo0001
,foo0002
ifoo0003
. Bash Hakerzy Wiki ma artykuł z kilkoma przykładami dla Ciebie.Jeśli musisz użyć dwóch różnych poleceń, użyj podpowłoki i
cd
tam najpierw, jak w odpowiedzi @ Ignacio .źródło
brace
rozszerzeniu, dziękuję!meniac ~: mv /tmp/f1/f2/f3/f4/f5/f6/{file.txt, file2.txt} mv: cannot stat ``/tmp/f1/f2/f3/f4/f5/f6/{file.txt,': No such file or directory
/bin/bash
, i nie jesteś w skrypcie, który ma/bin/sh
w shebang lub innej powłoce, która nie obsługuje rozwijania nawiasów? Jeśli biegnieszset
, czySHELLOPTS
zawieraszbraceexpand
?file.txt,
i nie powinno być spacjifile2.txt
.mv /folder1/folder2/folder3/file{,-2013}.txt
Uruchom operację w podpowłoce.
Zmiana katalogu roboczego nie zostanie propagowana do powłoki nadrzędnej.
źródło
ash
,dash
,ksh88
Nie mówiąc już stare Bourne powłoki są przykładem powłoki nie wspierającej.Jeśli chcesz sprytnego, oto rozszerzenie historii bash
Nie użyłbym tego sam, ponieważ nie mogę zapamiętać. Czasami używam ekwiwalentu vima , ale prawie za każdym razem muszę go szukać.
źródło
Możesz ustawić zmienną. Oczywiście ma to efekt uboczny polegający na pozostawieniu zmiennych w pobliżu.
źródło
(D="/folder1/folder2/folder3"; mv "$D"/file.txt "$D"/file-2013.txt)
lub po prostu dodającunset
polecenie na końcu. (Dodałem cytaty jako „najlepszą praktykę”; jeśli masz w zwyczaju ciągłego używania cytatów, nie będziesz musiał zatrzymywać się i drapać się w głowę, gdy pojawi się nazwa ścieżki zawierająca znaki specjalne.)cd
niż ustawić zmienną. Nie jest to dużo łatwiejsze, przyznaję.Lubię inne rozwiązania, ale oto inne, zaimplementowane jako skrypt z tablicami bash, pushd, popd:
źródło
Slhck bezpośrednio odpowiada na pytanie w najprostszy możliwy sposób, ale Valter lubi również odpowiedź autopop, więc oto ta, która ma te same linie;
źródło