Ich möchte alle Verzeichnisse anzeigen, die keine Dateien mit einer bestimmten Dateiende enthalten. Deshalb habe ich versucht, den folgenden Code zu verwenden:
find . -type d \! -exec test -e '{}/*.ENDING' \; -print
In diesem Beispiel wollte ich alle Verzeichnisse anzeigen, die keine Dateien mit der Endung enthalten .ENDING
, aber das funktioniert nicht.
Wo ist mein Fehler?
Antworten:
Hier ist eine Lösung in drei Schritten:
quelle
comm -3 <(find . -type f -name \*ENDING -exec dirname {} \; |sort -u) <(find . -type d |sort -u)
Auf geht's!
Oder alternativ (und pythonischer):
Bonus DLC Inhalt!
Die (meistens) korrigierte Version des Befehls find:
quelle
test: ...: binary operator expected
wenn sich mehrere*.ENDING
Dateien in einem Verzeichnis befinden.next(filter(lambda x: x.endswith('.ENDING'), filenames))
könnte auch unter Verwendung des Generatorverständnisses geschrieben werden, dhnext(x for x in filenames if x.endswith('.ENDING'))
.if not any(x.endswith('.ENDING') for x in filenames)
basierend auf der Tatsache zu verwenden , dass alle RückgabenFalse
für eine leere iterable.Die Hülle dehnt sich das
*
, aber in Ihrem Fall gibt es keine Shell beteiligt sind , nur der Test - Befehl ausgeführt finden . Daher wird die Datei, deren Existenz getestet wird, buchstäblich benannt*.ENDING
.Stattdessen sollten Sie Folgendes verwenden:
Dies würde dazu führen, dass sh erweitert wird,
*.ENDING
wenn der Test ausgeführt wird.Quelle: Finden Sie Globbing auf UX.SE.
quelle
-c: line 0: syntax error near unexpected token
('`. Meine Verzeichnisnamen haben das Format' xyz (dfdf) '. Tatsächlich handelt es sich um eine Kaliberbibliothek.sh: line 0: test: foo1/bar.ENDING: binary operator expected
das Verzeichnis, das eine Datei mit der Endung enthältENDING
.sh: -c: line 0: syntax error near unexpected token
('sh: -c: Zeile 0:' test -e test (test) / *. Ending '). / test (test) `. Aber wenn ich .ending auf .xyz ändere, erhalte ich das gleiche Ergebnis. Das liegt daran, dass ich Deckblätter als Verzeichnisnamen habe, richtig? Wie kann ich das beheben?Inspiriert von den Antworten von Dennis Nolte und MikeyB habe ich diese Lösung gefunden:
Es funktioniert basierend auf der Tatsache, dass
Das ist übrigens der Grund, warum stderr umgeleitet wurde
/dev/null
.quelle
Ich würde es persönlich in Perl machen
Sollte den Trick machen (funktioniert bei meinem sehr simplen Testfall).
quelle
Hier ist ein Einzeiler.
find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -u
Edit : Ups, wird auch nicht funktionieren.
quelle
q
in egrep ist für leiseMit können
egrep
Sie den Regex tauschen, den Sie benötigenls -1 "{}"
gibt die Dateinamen aus dem Befehl find ausquelle