Como excluir subdiretórios de um diretório específico do comando find?

Aug 15 2020

Estou tentando obter uma lista de arquivos que posso canalizar para wc -lobter uma contagem de palavras de todos eles (não usando wcdiretamente para que possa filtrar a lista de arquivos antes de usar o comando).

Minha estrutura de diretório é mais ou menos assim:

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

Eu gostaria de excluir certos diretórios do meu find, principalmente bibliotecas e outras coisas que não fiz. Posso fazer isso manualmente assim:

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

No entanto, é irritante ter que especificar explicitamente todas as pastas, e a lista também pode mudar a qualquer momento. Eu tentei usar /*e /**combinar o padrão, mas também não funcionou. Existe uma maneira de um desses "não" s em meu comando find que eu possa excluir todos os subdiretórios de um diretório específico, mas não excluir o próprio diretório? (inclui seus arquivos, mas não qualquer um de seus subdiretórios)?

Aqui está um palpite intuitivo:

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

Mas até findreclama disso:

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.

Portanto, parece que não maxdepthpode ser combinado em uma operação.

Há muitas perguntas e respostas sobre a exclusão de subdiretórios específicos, mas não genericamente nenhum subdiretório em um subdiretório específico.

Consegui fazê-lo funcionar em um único diretório com o -maxdepth 1, mas o problema é que essa é uma parte de exclusão de um comando maior e isso não funcionou depois que executei o comando completo. Potencialmente, posso precisar excluir subdiretórios específicos, bem como quaisquer subdiretórios em vários outros subdiretórios específicos.

Respostas

jeremysprofile Aug 16 2020 at 01:10

Apenas com encontrar:

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

Resposta original:

Um hack pode estar grep -vna saída de find:

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

Supondo que você esteja procurando especificamente por arquivos (ou seja, não por diretórios):

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

Isso é porque:

  • os arquivos diretamente sob /var/www/html/foldernão são diretórios, portanto, não correspondem à -pathcláusula.
  • diretórios diretamente abaixo de /var/www/html/foldernão correspondem -type f.
  • os arquivos em subdiretórios de /var/www/html/folderprecisam ter o extra /no caminho, para que correspondam à -pathexpressão.