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
findencontra 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
findimprime 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
numvariable. - O resultado é testado se for menor que
2. - Se o teste for bem-sucedido, o% outer
findimprime o diretório.
Notas:
- Poucas soluções estão presentes devido à portabilidade e à conformidade com POSIX:
-
! -name . -pruneem 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
-print0em vez de-printse 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
-printvocê pode querer usar:-exec sh -c 'basename "$(dirname "$1")"' sh {} \;para obter o diretório pai de cada
rawdataque corresponde aos critérios.