
Eu tenho uma pasta contendo arquivos e preciso iterá-los usando o comando unix "tr" tendo como saída o mesmo nome de antes (se possível) (o código abaixo não funciona):
FILES=/root/Desktop/prova/*
for f in $FILES ; do
echo "Processing $f file..."
cat $f | tr "\n" "," > $f.tmp & mv $f.tmp $f
done
Não entendo como posso usar este comando cat "$f" | tr "\n" "," > "$f"
e redirecionar a saída de cada arquivo. Então devo usar outro loop for para criar N comandos de ferramentas e executar juntos. Você tem algum conselho para estudos de loops?
Responder1
Isso cat
é um desperdício inútil de CPU, elimine-o. Envie a saída para um arquivo temporário e renomeie esse arquivo posteriormente:
tr x y < input > input.tmp && mv input.tmp input
Com moreutils
instalado, isso pode ser feito com sponge
(que faz o arquivo temporário nos bastidores):
tr x y < input | sponge input
input
Observe que tais renomeações podem destruir contextos sofisticados de ACL ou de segurança definidos no arquivo original, agora desvinculado .