Talvez algo como:
for dir in /target/dir/*/; do
(cd -- "$dir" && set -- *.jpg && [ "$#" -gt 4 ] && shift 4 && rm -f -- "$@")
done
Com zsh
, você pode diminuir para:
for dir (/target/dir/*(/)) rm -f $dir/*.jpg(N[5,-1])
Estou tentando fazer algo que parece bem simples, mas não consegui resolver.
Eu tenho um diretório com um monte de subdiretórios todos eles com vários arquivos (arquivos jpg). Eu quero executar um comando que mantenha apenas 4 ou N arquivos dentro desses diretórios. A ordem dos arquivos não é importante, já que vi perguntas relacionadas, dependendo da hora em que foram criadas
Eu joguei com o comando ls + head e tentei encontrar um loop com a opção -delete, mas ainda sem sorte.
Supondo que esses arquivos sejam regulares, sem espaços em branco, novas linhas, aspas, barras invertidas ou caracteres inválidos em seus caminhos:
find /target/dir/ -type f \
| awk '{t=$0; gsub(/\/[^/]*$/, "", t); if(a[t]++ < 4) print}' \
| xargs rm --
Veja os comentários abaixo sobre como você poderia adaptá-lo para nomes de arquivos mais engraçados se os seus utilitários suportarem certas extensões.
Tags command-line files rm