type
možnost filtrování výsledků
find
přijímá type
možnost výběru například pouze souborů.
find /path/to/files -type f -mtime +10 -delete
Vynechejte -delete
ukázat, co by smazal, a jakmile to ověříte, pokračujte a spusťte celý příkaz.
To by běželo pouze na souborech, ne na adresářích. Použijte -type d
naopak, vypisujte pouze adresáře, které odpovídají vašim argumentům.
Další možnosti
Možná si budete chtít přečíst man find
, protože existují další možnosti, které byste mohli v budoucnu potřebovat. Například -maxdepth
by vám umožnilo pouze omezit nalezené předměty do určité hloubky, např. -maxdepth 0
by se nevracel do podadresářů.
Několik poznámek
-
Zajímalo by mě, jak by příkaz odstranil složku, protože nemůžete odstranit složku s
rm
pouze. Budete potřebovatrm -r
za to. -
Také
/path/to/files*
je matoucí. Měli jste na mysli/path/to/files/
nebo očekáváte, že se zástupný znak rozšíří na několik názvů souborů a složek? -
Vložte
{}
v jednoduchých uvozovkách, tj.'{}'
abychom zabránili tomu, že nahrazený název souboru/adresáře bude interpretován shellem, stejně jako středník chráníme zpětným lomítkem.
Stejně jako v předchozích odpovědích (+1 pro obě) trik spočívá v použití -type f
predikát.
Všimněte si, že místo -exec rm '{}'
můžete také použít -delete
predikát. Ale nedělej to. S -exec rm '{}'
můžete (a měli byste) nejprve udělat -exec echo rm '{}'
abyste si ověřili, že je to opravdu to, co chcete. Poté znovu spusťte příkaz bez echo
.
Pomocí -delete
je rychlejší (žádné další fork()
a execve()
pro každý soubor), ale je to riskantní, protože -delete
funguje také jako podmínka, takže:
# delete *.tmp files
find . -type f -name '*.tmp' -delete
ale pokud POUZE zaměníte argumenty:
# delete ALL files
find . -type f -name '*.tmp' -delete
Pokud budete někdy potřebovat find
a rm
Chcete-li pracovat rychleji se spoustou souborů, podívejte se na find ... | xargs ... rm
UNIXový idiom.