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 find
comando. 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 folder2
e folder3
só 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 d
em 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
, -mindepth
e -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 1
no 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 find
estará vazia, então o test ( [ -z … ]
) retorna exit status 0
, sh
retorna 0
, -exec
é verdadeiro.