Como excluir subdiretórios de um diretório específico do comando find?
Estou tentando obter uma lista de arquivos que posso canalizar para wc -l
obter uma contagem de palavras de todos eles (não usando wc
diretamente 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é find
reclama 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 maxdepth
pode 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
Apenas com encontrar:
find /var/www/html -type f -not -path '/var/www/html/folder/*/*'
Resposta original:
Um hack pode estar grep -v
na saída de find:
find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
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/folder
não são diretórios, portanto, não correspondem à-path
cláusula. - diretórios diretamente abaixo de
/var/www/html/folder
não correspondem-type f
. - os arquivos em subdiretórios de
/var/www/html/folder
precisam ter o extra/
no caminho, para que correspondam à-path
expressão.