Chcę usunąć katalog B i D. Ale chcę zachować C i wszystkie jego potomne pliki i katalogi. Jaka jest komenda usuwania wszystkich katalogów potomnych katalogu nadrzędnego oprócz jednego katalogu i jego potomków.
Pomoc doceniona.
filesystem
directory
directory-structure
Joe Saad
źródło
źródło
A
w twoim przykładzie)? Usunąć je również czy zachować?Odpowiedzi:
To, czego chcesz, to polecenie:
Próbny:
Wyjaśnienie:
find DIRECTORY
wywołaj polecenie find, aby operować na KATALOGU-mindepth 1
: działa tylko z zawartością katalogu, unikaj samego katalogu, który jest na poziomie 0-maxdepth 1
: zapobiega zejściu do podkatalogów (rm -rf
zresztą jest rekurencyjny, więc nie musimy schodzić do podkatalogów, aby je usunąć)-type d
: szukaj tylko katalogów-not \( -name "keepMe" \)
zignoruj element o nazwie, którą chcesz zachować-exec rm -rf {} \;
usuń każdy znaleziony elementźródło
find
jest dobrym przyjacielem, ale Bashfor
itest
lepsi przyjaciele ...>: - DKorzystanie z rozszerzonych funkcji globalnej powłoki bash (które są domyślnie włączone w bieżących instalacjach Ubuntu), podane
możesz zająć się wszystkim z wyłączeniem
C
i jego zawartością za pomocą wyrażenia glob,A/!(C)
tjAby usunąć wszystko oprócz katalogu
C
i jego zawartości, możesz po prostu użyćodejście
źródło
('"
gdy uruchamiam go zdalnie za pośrednictwemssh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"
. Masz jakieś pomysły? Bardzo dziękuję.extglob
opcja powłoki jest włączona tylko dla powłok interaktywnych - nie wiem, czy można zmusićssh
do zrobienia tegoJednym prostym sposobem byłoby użycie trash-cli
możesz go zainstalować za pomocą
sudo apt-get install trash-cli
po zainstalowaniu możesz przejść do katalogu nadrzędnego A,
cd /A
a następnie wydać polecenie, wtrash B D
którym B i D są katalogami, które chcesz usunąć (trafią do kosza na dysku, na którym się znajdują, więc jeśli popełnisz błąd, możesz to zrobić odzyskać pliki)Testowane pod Ubuntu 16.04 i 14.04
źródło
trash ! C
?trash: cannot trash non existent
! ''extglob
jednak włączenia .Wystarczy użyć
for
pętli Basha itest
przefiltrować pożądane katalogi orazrm -rf
polecenie rekurencyjnego usuwania katalogów, tak jak to:Powoduje to iterację wszystkich elementów (plików i katalogów) w środku
/path/to/parent/
i rekurencyjnie usuwa element, jeśli jego nazwa nie jest równadir_survive
. Jeśli katalog nadrzędny jest katalogiem bieżącym, możesz pisać tylko*
jako ścieżkę.Jeśli nie masz pewności i chcesz przetestować, które elementy zostaną najpierw usunięte bez podejmowania jakichkolwiek działań, po prostu zamień
rm -rf
powyższe polecenie na,echo
a wyświetli tylko kandydatów do usunięcia.Oto przykładowy przebieg:
źródło