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

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

Estou tentando desenvolver um comando que encontre recursivamente diretórios que contenham apenas um ou mais diretórios no mesmo nível. De preferência com o findcomando. 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

Eu gostaria de continuar folder2e folder3só porque ele não contém arquivos em si, ele contém apenas pastas (com arquivos).

Responder1

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 coisa nela), excluindo aquelas que contêm arquivos. Se você também deseja excluir coisas como pipes e links simbólicos, você pode usar ! -type dem vez de -type f. Isso não pode ser feito em uma única instrução find porque find não pode corresponder a critérios de conteúdo complexos (isso não é XPath).

Responder2

Se eu entendi direito, isso deve bastar:

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, -mindepthe -quit, que não estão no POSIX, a solução pode não funcionar no seu sistema operacional ( -print -quité apenas para acelerar as coisas, você pode omitir este fragmento; -maxdepth 1 -mindepth 1no entanto, é importante).

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 não vazio. Isso é feito com -exec sh … \;, funciona como um teste aqui. Se o diretório não contiver nenhum não-diretório, a saída do inner findestará vazia, então o test ( [ -z … ]) retorna exit status 0, shretorna 0, -execé verdadeiro.

informação relacionada