Jak sprawić, by „znajdź” wykluczyło folder, w którym szuka?

18

Korzystam z następującego polecenia:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Chciałbym usunąć wszystkie foldery w processingfolderze (folderu przetwarzania nigdy nie należy usuwać).

Polecenie usuwa również processingfolder. Jak ograniczyć skrypt do usuwania tylko folderów w tym folderze?

Elad Dotan
źródło
1
potomność: stackoverflow.com/questions/13525004/…
Trevor Boyd Smith

Odpowiedzi:

32

Najprościej byłoby po prostu dodać -mindepth 1, co spowoduje pominięcie pierwszej hierarchii głębokości, a tym samym pominięcie katalogu nadrzędnego.

Ponadto nie potrzebujesz dodatkowego -execpołączenia rm, możesz tylko deletefoldery bezpośrednio, jeśli są puste.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Jeśli nie są puste:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Jeśli jesteś leniwy, możesz także rozwinąć symbol wieloznaczny. Ponieważ *domyślnie nie zawiera bieżącego katalogu ( chyba że dotglobjest ustawiony ), możesz także:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Nie dotyczy to jednak również ukrytych folderów, również ze względu na tę dotglobopcję.

slhck
źródło
Cześć, dostaję "znajdź: ostrzeżenie: podałeś opcję -mindepth po argumencie innym niż -typ -type, ale opcje nie są pozycjonowane (-mindepth wpływa na testy określone przed nim, a także te określone po nim). Proszę podać opcje przed innymi argumentami. "a także" znajdź: nie można usunąć `/ folder / 50d82faf0e09e ': Katalog nie jest pusty"
Elad Dotan
Następnie dodaj mindepth przed pisaniem. Aby usunąć katalogi, gdy nie są puste, możesz trzymać się rm, jak wcześniej.
slhck
4

Problem polega na tym, że find zwraca bieżący katalog (.) Wraz z innymi katalogami, więc usuwa folder przetwarzania oraz podkatalogi. Szybkim sposobem obejścia tego byłoby dodanie opcji

-not -name .

który zatrzymuje wyszukiwanie wyjścia z bieżącego katalogu, a z kolei uniemożliwia jego usunięcie.

To działałoby, gdybyś uruchomił polecenie w katalogu przetwarzania, aby uwzględnić fakt, że używasz ścieżki bezwzględnej:

-not -name /var/www/html/content/processing

Całe polecenie brzmiałoby:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;
Ksenopatyczny
źródło
Ostatnie polecenie jest nieprawidłowe. -nameodnosi się do basename, nigdy nie pasuje do niczego z ukośnikiem. Prawdopodobnie musisz użyć -path.
Kamil Maciorowski
1

Już odpowiedziałem, nadal chciałbym wymienić inne podejście.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Wyklucza to katalog główny (a także podkatalogi), a teraz możesz zastosować do niego dowolne polecenie.

>> Opcje:
-mindepth 1: Aby wykluczyć katalog główny
-maxdepth 1: Aby uniknąć parsowania podkatalogów. (W przypadku kwestionowanego scenariusza nie jest to potrzebne).
-type d: wyświetla tylko typy katalogów. Ta opcja powinna pojawić się po maksymalnym użyciu mindepth.

prashant
źródło
Dlaczego -maxdepth 1? Dlaczego -type ddwa razy? Czym różni się to od przyjętej odpowiedzi?
Attie
@Attie: Dzięki, poprawiłem błąd. maxdepth nie jest konieczny, ale przydałby się, jeśli chcesz uniknąć wyświetlania podkatalogów.
prashant