Suche in allen Unterverzeichnissen mit 0 Dateien

Suche in allen Unterverzeichnissen mit 0 Dateien

Ich möchte die Namen aller Unterverzeichnisse drucken, die keine Dateien enthalten (sie können Unterverzeichnisse enthalten). Folgendes funktioniert für das aktuelle Verzeichnis:

$ ls -p | grep -v / | wc -l | \
  xargs -I % test % -eq 0 && pwd

Ich denke, dass es eine elegantere Lösung geben könnte. Irgendwelche Vorschläge? Und wie muss ich es ändern, um alle Unterverzeichnisse rekursiv zu durchsuchen?

Ich habe eine Teststruktur: test/test1/test4 und test/test2/test3/test5. Die einzige Datei befindet sich in test/test1. Ich möchte den Befehl im Basisverzeichnis (test/) ausführen. Die Ergebnisse sollten sein: test/ ; test/test2/ ; test/test2/test3/, da dies die Verzeichnisse sind, die nur Unterverzeichnisse, aber keine Dateien enthalten. Zusätzlich akzeptabel wären die leeren Endpunkte test/test1/test4/ und test/test2/test3/test5.

Antwort1

Verwenden von fgrep zum Herausfiltern von Verzeichnissen mit Dateien:

$ find -type d | \
  grep -xFv -f <(find -type f -printf %h\\n)

Antwort2

Etwas wie das:

find . -type d -exec bash -c 'files=$(find $1 -mindepth 1 -maxdepth 1 -type f | wc -l) ; [[ $files -ne 0 ]] && exit 1 ; exit 0' script {} \; -print

Dies bash -c ...ist nur ein „kleines“ Skript, das 0 oder 1 zurückgibt, nachdem es nach Dateien im Verzeichnis gesucht hat.

Antwort3

Eine andere Herangehensweise an das Problem:

# Enable advanced glob
shopt -s globstar
# Enable matching hidden files (.*)
shopt -s dotglob
for d in **/; do
   nofiles=true
   for f in "$d"/*; do
     [ -f "$f" ] && nofiles=false && break
   done
   [ $nofiles = true ] && echo "$d"
done
shopt -u globstar
shopt -u dotglob

Durchläuft alle Ordner, durchläuft alle Elemente darin und sucht nach Dateien.

Nicht das kürzeste Skript, aber es scheitert nicht an Zeilenumbrüchen, Leerzeichen oder ähnlichem in Ihren Dateinamen. Und es ist auch nach 5 Jahren noch gut lesbar ;-)

verwandte Informationen