Listar todos os arquivos em um diretório de forma recursiva, mas excluem-se diretórios

6

Pergunta simples: estou executando o seguinte comando de localização:

find . -type d \( -path ./.git -o   \
                  -path ./log -o    \
                  -path ./public -o \
                  -path ./tmp       \) \
                  -prune -o         \
                  -print

Para listar todos os arquivos no meu diretório, excluindo os diretórios especificados.

Isso funciona muito bem, no entanto, o que eu também quero é excluir quaisquer diretórios reais da saída, portanto, se houver uma estrutura de diretórios da seguinte forma:

test
  -- foo.text
  -- bar.text

quando executo meu comando, gostaria de ver:

./test/foo.text
./test/bar.text

em vez de:

.
./test
./test/foo.text
./test/bar.text

Alguém pode ajudar?

    
por TheDelChop 23.05.2013 / 21:02

3 respostas

6

Use apenas ! -type d :

find . -type d \( -path ./.git -o \
                  -path ./log -o \
                  -path ./public -o \
                  -path ./tmp \) -prune -o \
       ! -type d -print
    
por 23.05.2013 / 22:09
5
find . -type f

fará isso. Você pode fazer exec se quiser operar em nomes de arquivos.

    
por 23.05.2013 / 21:07
0

Aqui está uma maneira de fazer isso. Eu estou piping sua saída de find (usando xargs ) para um pouco de bash que faz a pergunta "Isto não é um diretório?" e, se não for, faz eco no seu terminal.

Aqui está toda a explosão:

find . -type d \( -path ./.git -o -path ./log -o -path ./public -o -path ./tmp \) -prune -o -print | xargs -i bash -c 'if [ ! -d "{}" ]; then echo "{}"; fi'

Aqui está minha adição:

xargs -i bash -c 'if [ ! -d "{}" ]; then echo "{}"; fi'

Para explicar:

xargs -i replace string "{}" com argumentos (aqueles que são canalizados)

bash -c comandos lidos da string

if [ ! -d "{}"]; é um diretório.

echo "{}" ecoa o resultado da pesquisa.

fi; terminar se.

    
por 23.05.2013 / 21:24