Localiza arquivos em diretórios globados, excluindo alguns subcaminhos

1

Considere esta estrutura de diretório (e arquivo):

mkdir testone
mkdir testtwo
mkdir testone/.svn
mkdir testtwo/.git
touch testone/fileA
touch testone/fileB
touch testone/fileC
touch testone/.svn/fileA1
touch testone/.svn/fileB1
touch testone/.svn/fileC1
touch testtwo/fileD
touch testtwo/fileE
touch testtwo/fileF
touch testtwo/.git/fileD1
touch testtwo/.git/fileE1
touch testtwo/.git/fileF1

Eu gostaria de imprimir / encontrar todos os arquivos que estão nesses dois diretórios, mas excluindo aqueles nos subdiretórios .git e / ou .svn . Se eu fizer isso:

find test*

... então todos os arquivos são descartados, independentemente disso.

Se eu fizer isso (por exemplo, ):

$ find test* -path '.svn' -o -prune 
testone
testtwo
$ find test* -path '*/.svn/*' -o -prune 
testone
testtwo

... então eu recebo apenas os diretórios de nível superior descartados, e nenhum nome de arquivo.

É possível usar find sozinho para realizar uma pesquisa / listagem como essa, sem canalizar para grep (ou seja, fazendo um find para todos os arquivos e, em seguida: find test* | grep -v '\.svn' | grep -v '\.git' ; nomes de diretórios de alto nível, que eu não preciso)?

    
por sdaau 23.11.2016 / 13:42

2 respostas

1

Seus comandos find não estão dizendo o que fazer se o caminho fornecido não for correspondido. Se você quiser excluir tudo o que começar com um ponto e imprimir o resto, tente:

find test* -path '*/.*' -prune -o -print

para que possa remover qualquer coisa que corresponda a esse caminho e imprimir qualquer coisa que não seja.

Exemplo de saída:

testone
testone/fileC
testone/fileB
testone/fileA
testtwo
testtwo/fileE
testtwo/fileF
testtwo/fileD

Se você deseja excluir especificamente apenas .svn e .git , mas não outras coisas que começam com um ponto que você pode fazer:

find test* \( -path '*/.svn' -o -path '*/.git' \) -prune -o -print

que para este exemplo produz a mesma saída

se você quiser excluir os diretórios de nível superior, adicione -mindepth 1 like

find test* -mindepth 1 -path '*/.*' -prune -o -print

que dá

testone/fileC
testone/fileB
testone/fileA
testtwo/fileE
testtwo/fileF
testtwo/fileD
    
por 23.11.2016 / 13:49
1

Como complemento à resposta de Eric, find pode aceitar o operador ! para inverter predicados. Há também o teste -wholename que executará uma correspondência nos arquivos, incluindo seus caminhos. Então você poderia escrever algo assim:

find test* \( ! -wholename "*/.git/*" -a ! -wholename "*/.svn/*" \)
    
por 23.11.2016 / 14:08