![Suche in allen Unterverzeichnissen mit 0 Dateien](https://rvso.com/image/922412/Suche%20in%20allen%20Unterverzeichnissen%20mit%200%20Dateien.png)
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 ;-)