Jak wykluczyć podkatalogi określonego katalogu z polecenia find?

Aug 15 2020

Próbuję uzyskać listę plików, do których mogę przesłać potokiem, aby wc -luzyskać liczbę słów wszystkich z nich (nie używam wcbezpośrednio, więc mogę filtrować listę plików przed użyciem polecenia).

Moja struktura katalogów wygląda mniej więcej tak:

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

Chciałbym wykluczyć niektóre katalogi w moich find, głównie bibliotekach i inne rzeczy, których nie zrobiłem. Mogę to zrobić ręcznie w ten sposób:

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

Jednak denerwujące jest jawne określenie wszystkich folderów, a lista może się zmienić w dowolnym momencie. Próbowałem przy użyciu /*i /**do wzorca meczu, ale to nie działa, albo. Czy istnieje sposób, aby jedno z tych „nie” w moim poleceniu znajdowania pozwoliło wykluczyć wszystkie podkatalogi określonego katalogu, ale nie wykluczyć samego katalogu? (zawiera pliki, ale nie wszystkie jego podkatalogi)?

Oto intuicyjne przypuszczenie:

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

Ale nawet findnarzeka na to:

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.

Wydaje się więc, że maxdepthnie można go połączyć w operacji.

Istnieje wiele pytań i odpowiedzi na temat wykluczania określonych podkatalogów, ale generalnie nie ma żadnych podkatalogów w określonym podkatalogu.

Udało mi się zmusić go do pracy w jednym katalogu -maxdepth 1, ale problem polega na tym, że jest to część wykluczająca większego polecenia i to nie zadziałało po uruchomieniu pełnego polecenia. Potencjalnie może być konieczne wykluczenie określonych podkatalogów, a także wszelkich podkatalogów w kilku innych określonych podkatalogach.

Odpowiedzi

jeremysprofile Aug 16 2020 at 01:10

Wystarczy znaleźć:

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

Oryginalna odpowiedź:

Jeden hack może znaleźć grep -vsię na wyjściu find:

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

Zakładając, że szukasz konkretnie plików (tj. Nie katalogów):

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

To jest ponieważ:

  • pliki bezpośrednio pod /var/www/html/foldernie są katalogami, więc nie pasują do -pathklauzuli.
  • katalogi bezpośrednio pod /var/www/html/foldernie pasują -type f.
  • pliki w podkatalogach /var/www/html/foldermuszą mieć dodatkowe /w ścieżce, więc pasują do -pathwyrażenia.