Wie kann ich Unterverzeichnisse eines bestimmten Verzeichnisses vom Befehl find ausschließen?

Aug 15 2020

Ich versuche, eine Liste von Dateien zu erhalten, an die ich weiterleiten kann wc -l, um eine Wortanzahl von allen zu erhalten (nicht wcdirekt verwendet, damit ich die Dateiliste filtern kann, bevor ich den Befehl verwende).

Meine Verzeichnisstruktur sieht ungefähr so ​​aus:

- folder
   - file.php
   - file2.html
   - file3.php
   - folder1
   - folder2a
   - folder3b
   - folder4
- file.php
- file2.php

Ich möchte bestimmte Verzeichnisse in meinen find, größtenteils Bibliotheken und anderen Sachen, die ich nicht gemacht habe, ausschließen. Ich kann das manuell so machen:

find /var/www/html/ -type f -not -path "/var/www/html/folder/folder1" -not -path "/var/www/html/folder/folder2a" usw.

Es ist jedoch ärgerlich, alle Ordner explizit angeben zu müssen, und die Liste kann sich auch jederzeit ändern. Ich habe versucht, /*und /**Musterabgleich zu verwenden, aber das funktioniert auch nicht. Gibt es eine Möglichkeit für eines dieser "Nicht" in meinem Suchbefehl, dass ich alle Unterverzeichnisse eines bestimmten Verzeichnisses ausschließen kann, aber dieses Verzeichnis selbst nicht ausschließen kann? (einschließlich seiner Dateien, aber keines seiner Unterverzeichnisse)?

Hier ist eine intuitive Vermutung:

find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)

Aber findbeschwert sich auch darüber:

find: warning: you have specified the -maxdepth option after a non-option argument -not, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.

Es scheint maxdepthalso nicht möglich zu sein, in einer Operation kombiniert zu werden.

Es gibt viele Fragen und Antworten zum Ausschließen bestimmter Unterverzeichnisse, aber generisch keine Unterverzeichnisse in einem bestimmten Unterverzeichnis.

Ich konnte es in einem einzigen Verzeichnis zum Laufen bringen -maxdepth 1, aber das Problem ist, dass dies ein Ausschlussteil eines größeren Befehls ist und dass dies nicht funktioniert hat, nachdem ich den vollständigen Befehl ausgeführt habe. Möglicherweise muss ich bestimmte Unterverzeichnisse sowie Unterverzeichnisse in mehreren anderen spezifischen Unterverzeichnissen ausschließen.

Antworten

jeremysprofile Aug 16 2020 at 01:10

Nur mit find:

find /var/www/html -type f -not -path '/var/www/html/folder/*/*'

Ursprüngliche Antwort:

Ein Hack könnte grep -vauf der Ausgabe von find sein:

find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
2 root Aug 16 2020 at 01:13

Angenommen, Sie suchen speziell nach Dateien (dh nicht nach Verzeichnissen):

find /var/www/html -type f -not -path "/var/www/html/folder/*/*"

Das ist, weil:

  • Dateien direkt unter /var/www/html/foldersind keine Verzeichnisse, daher stimmen sie nicht mit der -pathKlausel überein .
  • Verzeichnisse direkt unter /var/www/html/folderstimmen nicht überein -type f.
  • Dateien in Unterverzeichnissen von /var/www/html/foldermüssen das Extra /im Pfad haben, damit sie mit dem -pathAusdruck übereinstimmen .