To pytanie jest jakby fazą II do pierwszego pytania, które tu zamieściłem
Mam katalog, który zawiera kilka podkatalogów, plików .zip i innych plików losowych nie zawartych w podkatalogu.
Chciałbym, aby skrypt wiersza poleceń usunął wszystkie podkatalogi z katalogu nadrzędnego, ale zachował wszystkie pliki zip i luźne pliki, które nie należą do żadnych podkatalogów. Wszystkie podkatalogi mają treść, więc uważam, że musiałbym wymusić ich usunięcie poleceniem -f.
Zasadniczo polecenie, które przegląda katalog nadrzędny (lub bieżący), usuwa z niego wszystkie foldery, ale zachowuje całą pozostałą zawartość i pliki, które nie są folderem ani nie są zawarte w folderze.
Rozumiem, że usuwanie elementów z wiersza polecenia wymaga szczególnej ostrożności, ale podjąłem już wszelkie niezbędne środki ostrożności, aby wykonać kopię zapasową zdalnie.
-r
,-R
,--recursive
Są synonimami czyli „usunąć katalogi i ich zawartość rekursywnie”.rm -R ./*/
- Pozwala to również uniknąć problemów z nazwami łączników.Oprócz metody wieloznacznej możesz także użyć
find
(przynajmniej GNU find), aby to zrobić:Podobnie jak w przypadku innych
find
wierszy, możesz uruchomić pierwszą część (find -mindepth 1 -maxdepth 1 -type d
), aby wyświetlić listę katalogów, które zostaną usunięte.Bezpieczniejszą opcją jest zrobienie czegoś takiego:
każda z nich przeniesie wszystkie rzeczy
../to-rm
zamiast je usuwać. Możesz sprawdzić, czy zrobiłeś to, co chciałeś, torm -Rf
ten katalog w wolnym czasie.źródło
to-rm
ifind
ładnie obsługuje katalogi zaczynające się od kropki (oprócz wszelkich innych kłopotliwych ucieczek). :)Możesz chcieć utworzyć skrypt dla niektórych z tych sugestii, a zwłaszcza
rm -R -- */
przechowywać go w folderze / usr / local / bin; lub utwórz plikalias
~ / .bashrc. Ponieważ tak łatwo jest źle wpisać polecenie i zepsuć system - nawet pojedyncza litera i / lub kolejność liter mogą mieć katastrofalne konsekwencje - posłużyłoby to jako bardziej niezawodne rozwiązanie niż konieczność wpisywania różnych opcji i argumentów za każdym razem, gdy chcesz wykonać to zadanie.Możesz także dołączyć do skryptu / polecenia opcję
-i or --interactive=once
lub,-I or --interactive=always
która będzie służyć jako kolejne narzędzie, aby uniknąć niezamierzonego usunięcia.Co więcej, coś takiego jak sugerowany derobert byłoby najlepsze; po prostu skopiuj / wklej skrypt do pliku / edytora terminali i dostosuj go do swoich konkretnych potrzeb, a pliki / katalogi zostaną przeniesione do jednego katalogu (którego zawartość możesz sprawdzić / zweryfikować), który możesz po prostu usunąć wydanie
rm -rf
polecenia.Inną opcją jest użycie aplikacji GUI, takiej jak menedżer plików, i po prostu wybierz wszystkie odpowiednie pliki / foldery, które chcesz usunąć. Sprawdź strony podręcznika dystrybucji, jeśli nie masz uprawnień.
Wreszcie, jeśli foldery są puste - w zasadzie proste nazwy plików - możesz użyć
rmdir
polecenia, aby je usunąć. Nie działa na wszystko, co możesz chcieć usunąć, ale przyda się, gdy będziesz chciał wykonać „sprzątanie domu”. ** Możesz wypróbować-p --ignore-fail-on-non-empty
opcję, która pozwoli ci usunąć niektóre podkatalogi oraz ich puste „rodzice” - katalogi, w których się znajdują.źródło
Najpierw musisz wyświetlić listę katalogów, a następnie usunąć je, nie przeszkadzając normalnym plikom, ls -d * /, wyświetla tylko podkatalogi, a potokowanie go za pomocą rm usuwa katalogi i zawartość, utrzymując luźne pliki nietknięte.
To polecenie powinno wykonać zadanie,
źródło
rm -rf -- */
?printf '%s\0' */ | xargs -r0 rm -rf --
pomógłby (w powłokach, w którychprintf
jest wbudowany i niels
) obejść zbyt duże błędy na liście argumentów , alels -d */ | xargs rm -rf
nie dodaje niczego AFAICT oprócz dodatkowych problemów." .."
(spacja..
), to usunie zawartość katalogu nadrzędnego z niektórymils
implementacjami. I to nie tylko spacje, ale także inne puste znaki, nowa linia, pojedynczy cudzysłów, podwójny cudzysłów, odwrotny ukośnik i nazwy plików zaczynające się od-
.printf
aby użyć do wygenerowania listy, w której każda nazwa jest zakończona znakiem null, aby można ją było przetworzyć zaxargs
pomocą-0
opcji, radzę zmodyfikować odpowiedź, aby zaktualizować ją z jego odmianą. Byłbym całkiem pewny, że byłby szczęśliwy, gdybyś użył swojego fragmentu kodu, jeśli go rozumiesz i nauczyłeś się, jak chroni on przed niepożądanym zachowaniem spowodowanym przez niektóre nazwy plików, które potencjalnie mogą istnieć.xargs
ma jedną zaletę w stosunku do zaakceptowanej odpowiedzi (działa, gdy w bieżącym katalogu jest bardzo duża liczba plików / katalogów), więc istnieje możliwość edytowania tego w użyteczną odpowiedź. Osobiście uważam, że odpowiadanie na pytania dotyczące wymiany stosów jest dobrym doświadczeniem w nauce - szczególnie gdy otrzymuję przydatne informacje zwrotne od innych użytkowników.rm -rf <directory name>
. To działa. Już samo wpisanierm <directory name>
prowadzi do liczby pytań podrzędnych, w których każdy z podkatalogów musi zostać usunięty ręcznie. Ale,rm -rf
pomaga w usuwaniu cały katalog wraz z jego sub katalogów naraz.źródło