rm -iR não funciona dentro de um loop

1

Aqui está o meu loop

ls -ltrd * | head -n -3 | awk '{print $NF}' | while read y; do

rm -iR $y

done

saída:

rm: descend into directory oct_temp17? rm: descend into directory oct_temp18? rm: descend into directory oct_temp19? ....

Ele não solicita a confirmação do usuário qual rm -i deve idealmente quando executado manualmente.

Estou usando o bash shell no Linux 3.10

Eu sou ingênuo para o Unix / Linux. Você pode por favor sugerir como posso fazer o script pedir-me a confirmação de cada pasta da saída ls?

    
por Know Your Tech 18.10.2017 / 16:05

1 resposta

2

1. Por que seu exemplo não funcionou como esperado

Os prompts do

rm precisam do STDIN para receber seus comentários. No seu exemplo, você usou STDIN para canalizar uma lista para o loop while , portanto, rm estava obtendo as respostas para seus prompts dos comandos ls / head / awk , em vez do usuário. / p>

A solução é não usar STDIN para fornecer a lista ao loop - por exemplo:

for y in $(ls -ltrd * | head -n -3 | awk '{print $NF}'); do
  rm -iR $y
done

2. Maneira mais segura de fazer isso

Esteja pronto para nomes de arquivos contendo espaços (você não precisa de awk , para obter o nome do arquivo, basta informar ls para imprimir apenas o nome do arquivo no 1º lugar):

IFS=
for y in $(ls -1qtrd * | head -n -3); do
  rm -iR "$y"
done

3. Uma maneira mais fácil de fazer isso

Como Archemar apontou: você nem precisa de um loop (contanto que não haja espaços nos nomes dos arquivos).

rm -iR $(ls -1qtrd * | head -n -3)
    
por 18.10.2017 / 16:17