Não sei se entendi o que você está tentando fazer.
Isso imprimirá todos os diretórios com o nome rawdata
de dentro de /appdata/frozen_files/
que contêm menos de dois arquivos com nomes terminando com .gpg~
(arquivos nos subdiretórios de rawdata
não contam):
find /appdata/frozen_files/ -type d -name "rawdata" -exec \
sh -c '
cd "$1" || exit 1
num=$(find . ! -name . -prune -type f -name "*.gpg~" -exec printf "\n" \; | wc -l)
[ "$num" -lt 2 ]
' sh {} \
\; -print
O procedimento é:
- O% externo
find
encontra todos os diretóriosrawdata
. - Para cada diretório,
sh
é chamado; o diretório está disponível como"$1"
dentro do comando fornecido. - Este shell
cd
-s para o diretório e executa o interiorfind
. - Este
find
imprime uma nova linha para cada arquivo*.gpg~
diretamente no diretório. - Essas novas linhas são contadas por
wc
. - O resultado (número) é armazenado como
num
variable. - O resultado é testado se for menor que
2
. - Se o teste for bem-sucedido, o% outer
find
imprime o diretório.
Notas:
- Poucas soluções estão presentes devido à portabilidade e à conformidade com POSIX:
-
! -name . -prune
em vez de-maxdepth 1
, -
-exec printf "\n" \;
em vez de-printf "\n"
.
-
-
A variável é usada para que possa ser reutilizada, por exemplo:
[ \( "$num" -gt 2 \) -a \( "$num" -lt 10 \) ]
-
Use
-print0
em vez de-print
se precisar analisar a saída de maneira segura. -
Analise a saída ou modifique o comando para extrair apenas uma parte de cada caminho obtido; por exemplo. em vez de
-print
você pode querer usar:-exec sh -c 'basename "$(dirname "$1")"' sh {} \;
para obter o diretório pai de cada
rawdata
que corresponde aos critérios.