2012-11-19 16 views
68

I Verzeichnisstruktur wie dieseAusschließen ein Unterverzeichnis finden mit

data 
|___ 
    | 
    abc 
    |____incoming 
    def 
    |____incoming 
    |____processed 
    123 
    |___incoming 
    456 
    |___incoming 
    |___processed 

Es gibt einen eingehenden Unterordner in alle Ordner innerhalb Data-Verzeichnis haben. Ich möchte alle Dateien aus allen Ordnern und Unterordnern mit Ausnahme der def/incoming und 456/incoming dirs erhalten. ich ausprobiert mit dem Befehl folgenden

find /home/feeds/data -type d \(-name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print 

aber es funktioniert nicht wie erwartet.

Ravi

+1

Dies ist nicht ein guter Rat, aber es wird Sie aus vielen Situationen schnell und schmutzig: Rohr, das auf 'grep -v something' auszuschließen, was auch immer es ist, dass Sie don‘ t wollen – Miquel

Antwort

126

Dies funktioniert:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*" 

Erläuterung:

  • find /home/feeds/data: starten rekursiv aus angegebenen Pfad zu finden
  • -type f: Finden Sie Dateien nur
  • -not -path "*def/incoming*": include nichts mit def/incoming als Teil von i ts Weg
  • -not -path "*456/incoming*": include nichts mit 456/incoming als
  • seines Weges Teil
+0

bekommen einen Fehler "finden: schlechte Option -not finden: Pfad-Liste Prädikat-Liste" – Ravi

+0

@Ravi verwenden Sie Bash Shell? Ich habe das gerade an meinem Terminal getestet und es funktioniert für mich. Versuchen Sie stattdessen, die Lösung zu kopieren und einzufügen, wenn Sie Änderungen an Ihrem Skript vorgenommen haben. –

+0

Es funktioniert, aber es listet die Verzeichnisse nicht Dateien in diesen Verzeichnissen auf. – Ravi

4

-name passt nur den Dateinamen, nicht den ganzen Weg. Sie möchten stattdessen -path für die Teile verwenden, in denen Sie die Verzeichnisse wie def/incoming beschneiden.

4

Nur aus Gründen der Dokumentation: Sie könnten tiefer zu graben haben, da es viele search'n'skip Konstellationen (wie sind Ich musste). Es könnte sich herausstellen, dass prune Ihr Freund ist, während -not -path nicht tun wird, was Sie erwarten.

So dies ein wertvolles Beispiel 15 Beispiele finden ist, der Verzeichnisse ausschließen:

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

auf die erste Frage zu verknüpfen, schließlich ohne arbeitete für mich wie folgt aus:

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

Dann Wenn Sie eine Datei suchen und dennoch Pfade ausschließen möchten, fügen Sie einfach | grep myFile.txt hinzu.

Es kann auch auf Ihre finden Version abhängen. Ich sehe:

$ find -version 
GNU find version 4.2.27 
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 
0
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/" 
+2

Einige Erklärungen könnten dies zu a machen viel bessere Antwort. –

+0

Vielen Dank für dieses Code-Snippet, das möglicherweise eine begrenzte kurzfristige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und sie für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen würde. Bitte bearbeiten Sie Ihre Antwort, um einige Erklärungen hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen –

Verwandte Themen