Ich möchte ein Unterverzeichnis des aktuellen Verzeichnisses finden, das (dh das Unterverzeichnis) zwei oder mehr reguläre Dateien enthält.
Ich interessiere mich nicht für Verzeichnisse mit weniger als 2 Dateien, noch für Verzeichnisse, die nur Unterverzeichnisse enthalten.
find
. In diesem Fall, weil GNUfind
die Namen von Verzeichnissen mit Zeichen entstellt, die im aktuellen Gebietsschema nicht druckbar sind (wie "ä" im Gebietsschema C). Siehe auch unix.stackexchange.com/questions/321697/…-printf '%h\0' | sort -z | uniq -zd | xargs -r0 ...
Dadurch werden alle Namen im oder unter dem aktuellen Verzeichnis gefunden und anschließend alle Namen herausgefiltert, die keine Namen von Verzeichnissen sind.
Die verbleibenden Verzeichnisnamen werden diesem kurzen Skript zugewiesen:
Dieses Skript zählt die Anzahl der regulären Dateien (Überspringen symbolischer Links) in dem Verzeichnis, das als erstes Befehlszeilenargument (von
find
) angegeben wurde. Der letzte Befehl im Skript ist ein Test, um festzustellen, ob die Anzahl 2 oder höher war. Das Ergebnis dieses Tests ist der Rückgabewert (Exit-Status) des Skripts.Wenn der Test erfolgreich war,
-print
wirdfind
der Pfad zum Verzeichnis ausgedruckt.Um auch versteckte Dateien (Dateien, deren Namen mit einem Punkt beginnen) zu berücksichtigen, ändern Sie das
sh -c
Skript von "sagen"zu
Testen:
quelle
[ "" -ge 2 ]
ein gültiger Test ist.dash
,bash --posix
Undtest
alle Display eine Fehlermeldung und Ausgang mit 2 (dh „Ein Fehler ist aufgetreten“)ksh
das als läuftsh
. Wird sofort geändert. Danke, dass du mich angestupst hast! :-)[ -f ... ]
dereferenziert symbolische Links. Sie sollten einen Test hinzufügen, um sie zu beseitigen, da die Frage angibt, dass nur reguläre Dateien gezählt werden sollen.Mit Hilfe von Gilles 'Antwort auf SU und seiner Umkehrung und einigen Modifikationen, hier was Sie brauchen.
Verzeichnisbaum.
Ergebnis:
quelle
test
als auch dasdir2
Verzeichnis in meinem Testaufbau (siehe meine Antwort).test/x1
undtest/x2
als Dateien hinzu ...$1
und$2
werden Verzeichnisse fürtest
, und das Verzeichnis wird übersehen.Ein weiterer
find
+wc
Ansatz:path/currdir
- Pfad zu Ihrem aktuellen Verzeichnis-maxdepth 1
- Berücksichtigen Sie nur direkte untergeordnete Unterordner! -empty
- leere Unterordner ignorieren! -path "path/currdir"
- Ignorieren Sie den aktuellen Verzeichnispfadcount=$(find "$1" -maxdepth 1 -type f | wc -l)
-count
wird mit der Anzahl der Dateien für jeden gefundenen Unterordner zugewiesen[ $count -ge 2 ] ... -print
- Drucken Sie den Namen / Pfad des Unterordners, der 2 oder mehr reguläre Dateien enthältquelle