Remove arquivos interativamente em loop com o redirecionamento de entrada padrão

0

Eu preciso interativamente (ou seja, rm -i ) remover arquivos armazenados na variável $to_remove (um caminho por linha). Infelizmente meu código não funciona porque a entrada padrão já é usada pelo redirecionamento <<< "$to_remove" .

while read -r f ; do
    rm -ir "$f"
done <<< "$to_remove"

Como posso corrigir isso?

    
por patryk.beza 13.08.2015 / 16:13

2 respostas

1

UPDATE: Dado que find é a fonte dos dados, eu usaria uma matriz:

readarray -t to_remove < <(find ...)
number_of_files=${#toremove[@]}
rm -i "${to_remove[@]}"

Se você é uma versão pré-4 de bash , use este loop para preencher a matriz.

while IFS= read -r fname; do
    to_remove+=("$fname")
done < <(find ...)

Nada disso funciona com arquivos que contenham novas linhas, mas acho que é mais fácil ignorar esse caso, embora em bash 4 você possa dispensar a chamada para find :

shopt -s nullglob globstar
to_remove=( "$WORKING_PATH"/**/* )

Suponho que você esteja preenchendo to_remove de um arquivo. Não faça isso; leia diretamente do arquivo.

while IFS= read -r fname <&3; do
    rm -i "$fname"
done 3< file.txt

Isso também usa um descritor de arquivo separado para ler o arquivo, de modo que a entrada padrão possa ser usada por rm .

(Se você estiver realmente lendo o texto to_remove , eu usaria apenas um arquivo temporário:

printf "%s" "$to_remove" > tmp.txt
while IFS= read -r fname <&3; do
    rm -i "$fname"
done 3< tmp.txt
rm tmp.txt

    
por 13.08.2015 / 17:36
0

Eu percebi isso.

IFS=$'\n'
for f in 'echo "$to_remove"' ; do
    rm -ir "$f"
done

Versão resumida:

IFS=$'\n'
rm -ir "$to_remove"

Essas duas versões funcionam conforme o esperado.

Estranho o suficiente, o seguinte código não funciona:

IFS=$'\n'
for f in "$to_remove" ; do
    rm -ir "$f"
done

Por quê?

    
por 13.08.2015 / 16:51