Looping através de pastas curinga e executando vários comandos no Bash

1

Eu tenho um conjunto de comandos para alterar o conteúdo dos arquivos chamados MenuSettings, que funcionam bem quando direcionados para uma pasta.

cd /Applications/snowflake/table-updater/Testing/Applications/Salford_100

sed -e '1r MenuSettings.bak' -e '1,2d' MenuSettings.txt >> MenuSettings2.txt
cat MenuSettings2.txt | sed '/^AppName: */{h;s///;x;}; /^\(AppName_.._..:\).*/{s///;G;s/\n/ /;}' >> MenuSettings3.txt
rm -v MenuSettings2.txt
mv -v MenuSettings3.txt MenuSettings.txt

No entanto, quando eu tento executá-los através de várias pastas, escrevendo isto

for dir in $(find salford_* -type d);do 

sed -e '1r MenuSettings.bak' -e '1,2d' MenuSettings.txt >> MenuSettings2.txt
cat MenuSettings2.txt | sed '/^AppName: */{h;s///;x;}; /^\(AppName_.._..:\).*/{s///;G;s/\n/ /;}' >> MenuSettings3.txt
rm -v MenuSettings2.txt
mv -v MenuSettings3.txt MenuSettings.txt

done

Eu recebo o erro

sed: MenuSettings.txt: No such file or directory

O que torna todos os comandos a seguir ineficazes e acabo com um arquivo de texto em branco na raiz da minha pesquisa. MenuSettings.txt está em todos os diretórios com o nome Salford. E quando eu testo acho ecoar o que a procura dele mostra tudo bem. Eu tentei uma série de métodos de encontrar, mas sem sucesso, alguém pode ajudar

    
por Eggfoot 04.02.2016 / 16:58

1 resposta

0

for não altera os diretórios para você. Você deve colocar ${dir}/ na frente de suas referências de arquivo e alterar algumas ' quotes para " para permitir a interpretação da variável shell

for dir in $(find salford_* -type d);do 

sed -e "1r ${dir}/MenuSettings.bak" -e '1,2d' ${dir}/MenuSettings.txt >> ${dir}/MenuSettings2.txt
sed '/^AppName: */{h;s///;x;}; /^\(AppName_.._..:\).*/{s///;G;s/\n/ /;}' ${dir}/MenuSettings2.txt >> ${dir}/MenuSettings3.txt
rm -v ${dir}/MenuSettings2.txt
mv -v ${dir}/MenuSettings3.txt ${dir}/MenuSettings.txt

done

Também removi um "Uso inútil de gato". Google que.

    
por 04.02.2016 / 17:29