AIX: localize diretórios não vazios

3

Em muitos sistemas unix, você poderia fazer algo como

find . -type d ! -empty

Em um sistema AIX, -empty não parece ser reconhecido. Alguma idéia de como eu poderia fazer a mesma coisa?

    
por Brian Henk 09.12.2009 / 21:30

2 respostas

4

Dan McG tem a ideia certa. Isso funciona:

find  . -type d -links 2 -exec sh -c '[ -z "$(ls -UA "$1/" )" ]' dummy {} \; -print

-links 2 economiza tempo excluindo diretórios com subdiretórios, porque se o AIX for como a maioria dos sistemas Unix, os únicos links que um diretório pode ter são os próprios. entrada, e as entradas .. em seus subdiretórios.

ls -UA não se preocupa em classificar (-U), e não precisa fazer o stat dos arquivos, apenas mostra o que obtém do readdir, então não é tão ruim. -A omite. e ..., portanto, se a saída for a string vazia, o diretório estava vazio.

Se você está invocando sh -c de qualquer maneira, você poderia fazer o que você precisa por diretório vazio no sh, ao invés de usar a saída do find -print0. É muito ruim que a descoberta não-GNU não tenha -exec {} + (ou seja, xargs embutidos).

Talvez, se você processar a saída de localização, possa fazê-lo com mais eficiência. por exemplo. se você ver dois diretórios em uma linha sem um arquivo, então você tem um diretório vazio? não é tão lento rodar sh -c e ls para todos os diretórios.

    
por 10.12.2009 / 04:56
3

Em primeiro lugar, vazio não é especificado para encontrar no padrão POSIX, e é por isso que nem todas as versões o suportam.

Não sei exatamente como fazer isso, mas isso pode indicar uma direção para resolvê-lo.

find . -type d -exec command '{}' \;

Isto irá executar o 'comando' para cada diretório, que o diretório está usando como argumento.

Agora, você pode usar algo como:

find . -type d -exec sh -c 'ls -R $1 | wc' dummy {} \;

Obviamente, isso não funciona, mas pode ajudar um pouco!

    
por 09.12.2009 / 23:30