rm
(onde lê a resposta de prompt) é /dev/null
(definido por GNU xargs, algumas outras implementações de xargs o manteriam como o pipe de ls).
Seu sh
está recebendo muitos argumentos de uma vez, mas você está processando apenas um ( $1
).
Observe também que o caractere de nova linha é tão válido quanto qualquer outro em um nome de arquivo, e é por isso que geralmente não é possível processar a saída de ls
de forma confiável.
com zsh
:
for dir (*(ND/)) {
flacs=($dir/*.flac(ND.))
(($#flacs)) || rm -ri -- $dir
}
Caso contrário, você poderia fazer:
find . ! -name . -prune -type d -exec sh -c '
for dir do
find "$dir/." ! -name . -prune -type f -name "*.flac" | read f ||
rm -ri "$dir"
done' sh {} +