Wie würde ich alle Verzeichnisse auflisten, in denen sich keine Datei mit einem bestimmten Dateinamen befindet? zB diesen Baum gegeben
/
/a
README
file001
file002
/b
README
file001
/c
file003
Ich möchte die Verzeichnisse auflisten, die keine Datei mit dem Namen README
haben. In diesem Fall handelt es sich um ein Verzeichnis /c
. Wie würde ich das machen? Ich kann mir keine Syntax vorstellen, die z find
.
Antworten:
Angenommen, eine
find
Implementierung wie GNUfind
akzeptiert ein{}
in ein Argument eingebettetes Argument für-exec
:Beispiel
Hier haben die Verzeichnisse 1/1 bis 5/5 eine README, die anderen Verzeichnisse sind leer.
Wenn wir nun diese Version unseres
find
Befehls ausführen :Verweise
quelle
Sie können die
-exec
Option verwendenfind
, um nach der Datei zu suchen und dann alle Ergebnisse zu drucken, für die die Prüfung fehlschlägt.quelle
Keine Notwendigkeit für
find
. Verwenden Sie einfach die Shell:Wenn Sie es benötigen rekursiv zu sein, können Sie (für
bash
,zsh
können dies tun , verwenden standardmäßigset -o globstar
inksh93
):(Beachten Sie, dass Punktdateien standardmäßig ausgeschlossen sind).
quelle
Mit
zsh
und Glob-Qualifikationsmerkmale (e
Zeichenfolge ):oder
Hinzufügen
D
, um versteckte Verzeichnisse einzuschließen:/
wählt nur Verzeichnisse aus unde_'[[ ! -f $REPLY/README ]]'_
wählt ferner nur die Verzeichnisnamen aus, für die der Shell-Code zwischen den Anführungszeichen zurückgegebentrue
wird,$REPLY
dh für jeden Verzeichnisnamen ( ), auf den der Glob*(/)
erweitert wird, wird er ausgeführt[[ ! -f $REPLY/README ]]
und behält den Namen des Verzeichnisses bei, wenn das Ergebnis lautettrue
.Die zweite Form
^e_'.....'_
verwendet dasselbe Glob-Qualifikationsmerkmal, negiert (diesmal wird der bedingte Ausdruck jedoch nicht negiert :)[[ -f $REPLY/README ]]
.Das oben Gesagte gibt nur Verzeichnisnamen im aktuellen Verzeichnis zurück.
Wenn Sie rekursiv suchen möchten (um versteckte Verzeichnisse einzuschließen, fügen Sie das
D
Qualifikationsmerkmal hinzu):quelle
Tragbar könnten Sie tun:
[ -f file ]
Testet, ob die Datei vorhanden ist und als reguläre Datei bestätigt wurde (nach Symlink-Auflösung).Wenn Sie testen möchten, ob es nur existiert (als Eintrag in diesem Verzeichnis), unabhängig von seinem Typ, benötigen Sie:
[ -e file ] || [ -L file ]
Beachten Sie jedoch, dass Sie eine Suchberechtigung für das Verzeichnis benötigen, um diese Tests durchzuführen. Möglicherweise möchten Sie einige[ -x "$dir" ]
Tests hinzufügen , um folgende Fälle zu berücksichtigen:Oder um die Rennbedingungen zu vermeiden, mit
zsh
:Siehe auch Wie kann ich feststellen, ob in Bash keine reguläre Datei vorhanden ist? auf SO.
quelle