rm -i
lê sua resposta da entrada padrão, que herda do while
loop. Portanto, uma linha de texto list.txt
está sendo usada como resposta para o "realmente remover?" questão. Para corrigir, você precisará separar as duas fontes de entrada. A maneira mais fácil é read
obter sua entrada de um descritor de arquivo separado:
while IFS= read <&3 -r i; do
rm -i -- "$i" # Quote the file name, not just to be safe,
# but because it's the right syntax.
done 3< list.txt
Você não está mais redirecionando a entrada padrão (fd 0) para o loop while, portanto rm
, lerá o terminal conforme desejado.
Como alternativa, você poderia ter feito:
IFS=$'\n' # set field separator to newline
set -f # disable globbing upon command substitution
rm -i -- $(cat list.txt)
Ou, com xargs GNU:
xargs -rd '\n' --arg-file=list.txt rm -i --
y
, o arquivo anterior teria sido excluído?y
, mas qualquer nome começando comy
. Aparentemente,rm
apenas olha para o primeiro caractere de qualquer resposta que recebe: 'y' é sim, qualquer outra coisa é não.Para algo um pouco mais sofisticado do que responder sim ou não a cada arquivo, você pode usar
iselect
a seleção interativa baseada em ncurses. por exemploou para permitir a seleção de arquivos no diretório atual:
Isso exibirá uma lista baseada em nurses em tela cheia (terminal completo), onde os arquivos podem ser selecionados e desmarcados à vontade pressionando ESPAÇO. pressione ENTER para aceitar suas seleções (as entradas selecionadas serão impressas em stdout) ou
q
para sair (nada impresso em stdout). pressioneh
para obter ajuda.Observe o
echo rm
- eu escrevi assim para testes. altere para apenasrm
quando estiver confiante de que entende o que está fazendo.Observe também que
xargs
está sendo usado aqui\n
como o separador de entrada. Isso não funcionará se algum dos nomes de arquivos tiver caracteres de avanço de linha. Por outro lado,iselect
também não funcionará corretamente - ele espera um item por linha - infelizmente,iselect
não tem uma opção para entrada ou saída terminada em nulo.iselect
está empacotado para debian, provavelmente ubuntu e outras distribuições também. A página inicial está em http://www.ossp.org/pkg/tool/iselect/fonte