Frage Schließen Sie ein Unterverzeichnis mit find aus


Ich habe eine Verzeichnisstruktur wie diese

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

Es gibt einen eingehenden Unterordner in allen Ordnern im Datenverzeichnis. Ich möchte alle Dateien aus allen Ordnern und Unterordnern mit Ausnahme der def / incoming und 456 / incoming dirs erhalten. Ich habe es mit folgendem Befehl ausprobiert

 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


76
2017-11-19 19:11


Ursprung


Antworten:


Das funktioniert:

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

Erläuterung:

  • find /home/feeds/data: Suche rekursiv vom angegebenen Pfad
  • -type f: nur Dateien finden
  • -not -path "*def/incoming*": schließe nichts mit ein def/incoming als Teil seines Weges
  • -not -path "*456/incoming*": schließe nichts mit ein 456/incoming als Teil seines Weges

142
2017-11-19 19:22



Nur um der Dokumentation willen: Sie müssen vielleicht tiefer graben, da es viele Such-und-Konstellationen gibt (wie ich musste). Es könnte sich herausstellen, dass prune ist dein Freund während -not -path werde nicht tun, was du erwartest.

Dies ist also ein wertvolles Beispiel für 15 Beispiele zum Auffinden von Verzeichnissen:

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

Um auf die erste Frage zu verlinken, schliesst sich abschließend für mich so gearbeitetes aus:

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

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

Es kann auch auf Ihre gefundene Version abhängen. Aha:

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX

5
2017-08-04 07:15



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


4
2017-11-19 19:16



find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

1
2018-01-17 22:12