Wiem, że możesz mkdir
utworzyć katalog i touch
plik, ale czy nie ma sposobu, aby wykonać obie operacje za jednym razem?
tj. jeśli chcę wykonać poniższe czynności, gdy folder other
nie istnieje:
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
Błąd:
cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory
Czy ktoś wymyślił funkcję jako obejście tego problemu?
Odpowiedzi:
Służy
&&
do łączenia dwóch poleceń w jednej linii powłoki:Uwaga: Wcześniej
;
zalecałem użycie do oddzielenia dwóch poleceń, ale jak wskazał @trysis, prawdopodobnie lepiej jest używać go&&
w większości sytuacji, ponieważ w przypadkuCOMMAND1
niepowodzeniaCOMMAND2
również nie zostanie wykonany. (W przeciwnym razie może to prowadzić do problemów, których mógłbyś się nie spodziewać).źródło
&&
, tak jak w przypadku;
, gdy pierwsze polecenie zawiedzie, drugie polecenie nadal będzie działać (i również się nie powiedzie, ponieważ ten katalog jeszcze nie istnieje). Ze&&
jeśli pierwsze polecenie zakończy się niepowodzeniem, druga komenda nie działa.mkdir -p /my/other/path/here && touch $_/cpredthing.txt
. W$_
rozszerza się zasadniczo do „ostatniej argumentem ostatniego wykonanego polecenia”.touch
mieć-p
taki parametr jakmkdir
robi.Najpierw musisz utworzyć wszystkie katalogi nadrzędne.
Jeśli chcesz być kreatywny, możesz stworzyć funkcję :
A następnie użyj go jak każdego innego polecenia:
źródło
&&
- jak to jest?supertouch "/tmp/abc/def ghi/jkl mno.txt"
i nie udało się. Wszystkie poleceniadirname
,mkdir
itouch
dał erros.mktouch
to jest.Zrób to za pomocą / usr / bin / install:
gdy nie masz pliku źródłowego:
źródło
-D /dev/null
, co jest dla mnie łatwiejsze do zapamiętania.Oto, co bym zrobił:
mkdir -p /my/other/path/here && touch $_/cpredthing.txt
Tutaj
$_
jest zmienną, która reprezentuje ostatni argument poprzedniego polecenia, które wykonaliśmy w linii.Jak zawsze, jeśli chcesz zobaczyć, jakie może być wyjście, możesz to przetestować za pomocą
echo
polecenia, na przykład:echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
Które wyjścia jako:
Jako bonus możesz napisać wiele plików naraz, używając rozszerzenia nawiasów klamrowych, na przykład:
Ponownie, całkowicie testowalne za pomocą
echo
:źródło
źródło
dirname -z "$@" | xargs -0 mkdir -p
zamiast tego ze względu na wydajność. (Przestań się czaić i dołącz, na litość Pete'a! ;-)możesz to zrobić w dwóch krokach:
źródło
źródło
jak widziałem i testowałem na forum unixowym, rozwiązuje to problem
źródło
nie potrzeba
if then
instrukcji ... możesz to zrobić w jednym wierszu, używając znaku;
- lub w dwóch wierszach -
-
-p
błąd zapobiega zwracaniu się, jeśli katalog już istnieje (właśnie tego szukałem :))źródło
W specjalnym (ale nie rzadkim) przypadku, gdy próbujesz odtworzyć tę samą hierarchię katalogów,
cp --parents
może być przydatne.Na przykład, jeśli
/my/long
zawiera pliki źródłowe imy/other
już istnieje, możesz to zrobić:źródło
jeśli chcesz mieć prostotę z tylko jednym fragmentem parametru:
źródło
rm -rf
komend. - † To znaczy godzin , zakładając, że przestrzegasz rozsądnych zasad kontroli wersji / tworzenia kopii zapasowych ... w przeciwnym razie mogą to być miesiące.rm -rf
nigdy nie należy sugerować bez odpowiedniego wyjaśnienia i ostrzeżeń.