Eine Möglichkeit wäre, mit find
der -exec
Aktion 's einen benutzerdefinierten Test der Anzahl der Dateien auszuführen.
Man könnte einen zweiten find
Befehl zusammen mit verwenden wc
, um Dateien in jedem Verzeichnis zu finden und zu zählen, aber wahrscheinlich wäre eine bessere Option, das Globbing zu schälen, um die Dateinamen in ein Array zu schlürfen, und dann einen logischen Wert zurückzugeben, der angibt, ob die Größe des Arrays kleiner ist als die Schwelle dh
files=( dir/* ); ((${#files[@]} < 10))
Dass sie alle zusammen sollten wir in der Lage sein listen alle Unterverzeichnisse mit weniger als 10 Dateien (einschließlich der Unterverzeichnisse) mit
find . -depth -type d ! -name '.' -exec bash -c '
shopt -s nullglob; files=( "$1"/* ); ((${#files[@]} < ${2:-10}))
' bash {} 10 \; -print0 | xargs -0
(Sie können die Zahl 10
nach dem bash {}
für verschiedene Schwellenwerte anpassen. Bei der ${2:-10}
Parametererweiterung werden standardmäßig 10 Dateien verwendet, wenn kein zweites Argument angegeben wird.) Zum Beispiel gegeben
$ tree .
.
├── bar
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ ├── file5
│ ├── file6
│ ├── file7
│ ├── file8
│ ├── file9
│ └── other file
├── baz
│ ├── other file
│ └── subdir
└── foo
└── somefile
4 directories, 12 files
dann
find . -depth -type d ! -name '.' -exec bash -c '
shopt -s nullglob; files=( "$1"/* ); ((${#files[@]} < "${2:-10}"))
' bash {} 10 \; -print0 | xargs -0
./foo ./baz/subdir ./baz
Wenn dies das Richtige zu sein scheint, können Sie sie tatsächlich durch Hinzufügen entfernen, rm -rf
aber seien Sie bitte sehr vorsichtig - denken Sie daran, dass es kein "Rückgängigmachen" gibt.
find . -depth -type d ! -name '.' -exec bash -c '
shopt -s nullglob; files=( "$1"/* ); ((${#files[@]} < ${2:-10}))
' bash {} 10 \; -print0 | xargs -0 rm -rf
(Das xargs
könnte beseitigt werden, indem eine andere -exec
Aktion verwendet wird, um rm
direkter auszuführen , aber die obige Formulierung erleichtert die Verallgemeinerung - Drucken, Statisieren, Entfernen oder was auch immer.)
Beachten Sie, dass dies rekursiv erfolgt, dh ein Verzeichnis, das anfänglich mehr als n
Dateien einschließlich Unterverzeichnisse enthält, kann entfernt werden, da einige dieser Unterverzeichnisse selbst entfernt werden, find
um den Verzeichnisbaum zu sichern. Das aktuelle Verzeichnis ist ausdrücklich vor einem möglichen Löschen durch den ! -name '.'
Test geschützt .
Wenn Sie es nicht benötigen, um rekursiv zu handeln, können Sie einfach Verzeichnisse durchlaufen und dieselbe Dateizählung und Testlogik ausführen, z. B. um alle Verzeichnisse der ersten Ebene zu entfernen, die weniger als 10 Dateien im aktuellen Verzeichnis enthalten
shopt -s nullglob
for d in */; do
files=( "$d"/* )
((${#files[@]} < 10)) && echo rm -rf -- "$d"
done