Das Ziel besteht darin, Verzeichnisse mit dem angegebenen Namen zu finden und alle darin enthaltenen Dateien zu löschen, wobei die tatsächlichen Verzeichnisse erhalten bleiben
find /home/www/sites/ -iname '_cache' -exec du -hs {} \;
Dadurch bekomme ich eine Liste der Dateien mit ihrer Größe
204K /home/www/sites/test.site.com/html/development/Temporary/_cache
904K /home/www/sites/test.site2.com/html/development/Temporary/_cache
ist dies mit dem Linux-Befehl „Find“ möglich?
Antwort1
Ich habe etwas ausprobiert und es scheint zu funktionieren; es ist eine ähnliche Lösung, die Alex hier gepostet hat.
find . -iname '_cache' | xargs -I {} find {} -type f -maxdepth 1 -exec rm {} \;
Es sollten nur Dateien gelöscht werden, die sich im Verzeichnis _cache befinden und nur in diesem Verzeichnis. Es werden keine Dateien aus Unterverzeichnissen des Verzeichnisses _cache gelöscht.
Probieren Sie es natürlich vor der Verwendung aus und setzen Sie statt rm ls oder etwas Harmloses ein.
Antwort2
Ich habe diese Logik nicht gründlich getestet, aber Sie könnten innerhalb einer Schleife Folgendes tun:
for findname in $(find /path/to/search -name '_pattern')
do
find $findname -type f
done
Sie erhalten also die Liste der Dateien, die Ihrem Suchmuster entsprechen, und können dann jede dieser Dateien mit einer neuen Suche nach zu löschenden Dateien durchsuchen.
So wie es geschrieben ist, erhalten Sie eine Liste von Dateien, sodass Sie diese in eine Datei umleiten und diese dann mit einem rm durchlaufen können. Sie können auch ein Exec an die Suchschleife anhängen. Ich würde auf jeden Fall empfehlen, es zuerst wie geschrieben auszuführen, um die Logik zu testen und sicherzustellen, dass die Übereinstimmungen gut aussehen.
Antwort3
Korrekter Befehl zum Löschen
find . -iname '_cache' | xargs -I {} find {} -type f -maxdepth 1 -delete
Antwort4
find hat die Option -delete. Diese löscht alle Übereinstimmungen.
Aus der Manpage
-löschen
Delete files; true if removal succeeded. If the removal failed, an error message is issued. If -delete fails, find's exit stat- us will be nonzero (when it eventually exits). Use of -delete automatically turns on the -depth option. Warnings: Don't forget that the find command line is evaluated as an expression, so putting -delete first will make find try to delete everything below the starting points you specified. When testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid later surprises. Because -delete implies -depth, you cannot usefully use -prune and -delete together.