Looping através de pastas curinga e executar 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//\1/;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 isso

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//\1/;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 encontro para 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


1
Bem vindo ao SuperUser. Você nunca muda para esse diretório, certo?
Run CMD

Obrigado, eu entro em cada dir chamado salford_xxx e edito o arquivo MenuSettings.txt onde eu preciso de um número de segmentos substituindo, portanto, o sed sendo usado.
Eggfoot

Respostas:


0

for não altera diretórios para você. Você deveria colocar ${dir}/ na frente de suas referências de arquivo e alterar alguns ' citações para " permitir a interpretação de variáveis ​​de 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//\1/;G;s/\n/ /;}' ${dir}/MenuSettings2.txt >> ${dir}/MenuSettings3.txt
rm -v ${dir}/MenuSettings2.txt
mv -v ${dir}/MenuSettings3.txt ${dir}/MenuSettings.txt

done

Eu também removi um "Uso inútil de gato". Google isso.


Obrigado, isso foi muito útil. Dado que eu também tinha subdiretórios nas pastas, eu coloquei o parâmetro -maxdepth em find também.
Eggfoot

Então, por favor, aceite minha resposta, para que minha reputação cresça e eu possa acabar governando o mundo.
waltinator

Eu fiz isso!
Eggfoot
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.