在 Bash 中循环遍历通配符文件夹并执行多个命令

在 Bash 中循环遍历通配符文件夹并执行多个命令

我有一组命令来更改名为 MenuSettings 的文件的内容,当这些命令指向文件夹时,它们可以正常工作。

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

但是当我尝试在多个文件夹中运行它们时,写入

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

我得到了错误

sed: MenuSettings.txt: No such file or directory

这使得以下所有命令都无效,最终我在搜索的根目录中得到了一个空白的文本文件。MenuSettings.txt 在每个带有 Salford 名称的目录中。当我测试 find 以回显其搜索的内容时,它显示一切正常。我尝试了许多 find 方法,但都无济于事,有人能帮忙吗

答案1

for不会为您更改目录。您应该${dir}/在文件引用前面添加,并更改一些'引号以"允许 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

我还删除了“cat 的无用用途”。Google 一下。

相关内容