Muszę usunąć wszystkie foldery w folderze za pomocą codziennego skryptu. Folder na ten dzień należy pozostawić.
Folder „myfolder” ma 3 podfoldery: „test1”, „test2” i „test3” Muszę usunąć wszystko oprócz „test2”.
Próbuję dopasować tutaj dokładną nazwę:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
LUB
find /home/myfolder -type d ! -name 'test2' -delete
To polecenie zawsze próbuje również usunąć główny folder „myfolder”! Czy istnieje sposób, aby tego uniknąć?
!
operatora:\!
lub'!'
.Odpowiedzi:
Spowoduje to usunięcie wszystkich folderów w środku
./myfolder
oprócz tego./myfolder/test2
i cała jego zawartość zostanie zachowana:Jak to działa
find
uruchamia polecenie znajdowania../myfolder
mówi find, aby rozpocząć od katalogu./myfolder
i jego zawartości.-mindepth 1
nie pasować do./myfolder
siebie, tylko pliki i katalogi pod nim.! -regex '^./myfolder/test2\(/.*\)?'
mówi find, aby wykluczyć (!
) dowolny plik lub katalog pasujący do wyrażenia regularnego^./myfolder/test2\(/.*\)?
.^
dopasowuje początek nazwy ścieżki. Wyrażenie(/.*\)?
odpowiada albo (a) ukośnikowi, po którym następuje cokolwiek, albo (b) w ogóle nic.-delete
każe znaleźć, aby usunąć pasujące (to znaczy niewykluczone) pliki.Przykład
Rozważ strukturę katalogów, która wygląda;
Możemy uruchomić polecenie find (bez
-delete
), aby zobaczyć, co pasuje:Możemy sprawdzić, czy to zadziałało, sprawdzając pozostałe pliki:
źródło
-prune
pozostawienietest2/*/
podkatalogów w spokoju: wróć dorm -r
i dodaj-maxdepth 1
../myfolder
. Potrzebujesz brakującego (IMvhO) tylko-type d
dla katalogów .find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./myfolder/test2\(/.*\)?'
Za pomocą bash :
Przykład:
źródło
tl; dr
Usuń echo, jeśli jesteś zadowolony z listy plików.
Użycie
-mindepth 1
spowoduje, że główny katalog nie zostanie wybrany.Ale nie
-not -name test2
pozwoli uniknąć podkatalogów wewnątrz :test2
Aby to zrobić, potrzebujesz czegoś takiego jak śliwka:
Ale nie używaj
delete
, jak to sugeruje,depth
a to zacznie wymazywać z najdłuższej ścieżki:Albo użyj
rm -rf
(usuń,echo
jeśli chcesz usunąć):Lub użyj również,
maxdepth
jeśli wszystko, czego potrzebujesz, to usunąć katalogi (i wszystko w środku) (usuń,echo
aby faktycznie usunąć):A
-delete
nadal nie powiedzie się, jeśli katalog nie jest pusty:źródło
Jeśli używasz zsh, możesz:
źródło
Przetestowano za pomocą poniższego polecenia i działało dobrze
źródło
-mindepth 1
) powoduje, że ten górny katalog spełnia wszystkie kryteria (jest to katalog i nie ma nazwy „test2”), więc zostaje usunięty.