Como remover interativamente todos os diretórios que correspondem aos critérios fornecidos?

1

Meu script abaixo tem dois problemas:

  • O script pára após o primeiro diretório correspondido
  • rm -i não é bem interativo

Quais são as minhas suposições incorretas que fazem com que ele falhe? Como posso consertar isso?

ls -1A | xargs -d "\n" \
sh -c '(find "$1" -mindepth 1 -maxdepth 1 \
    -name "*.flac" | read 2>/dev/null) || rm -ri "$1"'
    
por sevo 29.03.2015 / 17:51

1 resposta

2
O stdin de

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 {} +
    
por 29.03.2015 / 20:02