Como recursivamente encontrar pastas em um sistema Linux, que contém apenas pastas?

0

Estou tentando descobrir um comando que recursivamente encontre diretórios que contenham apenas um ou mais diretórios no mesmo nível. De preferência com o comando find . Como find . -type d .

Por exemplo, na seguinte estrutura de arquivos:

/tmp/folder1/folder1a/test.jpg
/tmp/folder1/file1a.tmp
/tmp/folder2/folder2a/test.jpg
/tmp/folder3/folder3a/
/tmp/folder3/folder3b/file.jpg

Gostaria de acertar apenas folder2 e folder3 , pois não contém arquivos propriamente ditos, apenas contém pastas (com arquivos).

    
por Bob Ortiz 06.02.2018 / 23:50

2 respostas

3

comm -23 <(find . -type d ! -empty | sort -u) <(find . -type f -printf '%h\n' | sort -u)

Esta é uma lista de pastas não vazias (pelo menos uma delas), excluindo as que contenham arquivos. Se você também quiser excluir itens como pipes e links simbólicos, use ! -type d em vez de -type f . Isso não pode ser feito em uma única instrução find porque o find não pode corresponder a critérios complexos de conteúdo (isto não é XPath).

    
por 07.02.2018 / 01:03
2

Se eu entendi bem, isso deve ser feito:

find . -type d ! -empty -exec sh -c '\
[ -z "'find "$1" -maxdepth 1 -mindepth 1 ! -type d -print -quit'" ]\
' sh {} \; -print

Por causa de -empty , -maxdepth , -mindepth e -quit , que não estão em POSIX, a solução pode não funcionar no seu sistema operacional ( -print -quit é apenas para acelerar as coisas, você pode omitir isso fragmento; -maxdepth 1 -mindepth 1 é importante embora).

O truque é executar um shell separado para cada diretório não vazio, que verifica (não recursivamente) se o diretório não contém nenhum diretório diferente. Isso é feito com -exec sh … \; , ele age como um teste aqui. Se o diretório não contiver nenhum diretório não, a saída do find interno estará vazia, portanto o teste ( [ -z … ] ) retornará o status de saída 0 , sh retornará 0 , -exec is verdade.

    
por 07.02.2018 / 01:04