我需要做的是将文件夹amtlib.framework
替换为我的Mac上的每个Adobe应用程序
如果我这样做:
cd /Applications; ls | grep Adobe
,这给了我所需的所有文件夹
这里有一些伪代码:
apps = ls | grep Adobe
for each x in apps
if (x/x.app/contents/frameworks/amtlib.framwork) //if this folder exists
add .bak extension //amtlib.framework.bak
copy ~/Downloads/.../amtlib.framwork to x/x.app/contents/frameworks/
我如何将其作为bash脚本实现?
答案 0 :(得分:0)
像
这样的东西for x in $( ls | grep Adobe) ; do
if [[ -d "${x}"/"${x}".app/contents/frameworks/amtlib.framwork ]] ; then
# add .bak extension # //amtlib.framework.bak
#? mkdir "${x}"/"${x}".app/contents/frameworks/amtlib.framwork.bak
#? /bin/mv "${x}"/"${x}".app/contents/frameworks/amtlib.framwork {x}/${x}.app/contents/frameworks/amtlib.framwork.bak
/bin/cp ~/Downloads/.../amtlib.framwork to "${x}"/"${x}".app/contents/frameworks/
else
: # ??? what do you want to do if there's not
fi
done # loop
如果您的dirnames中可能有空格,(不确定OSX是否支持-print0
),请尝试
find . -name 'Adobe' -print0 \
| while read x ; do
if ....
作为一个FYI,bash中的分配就像(=
周围没有空格)一样:
apps=$(ls | grep Adobe)
根据具体情况,您需要使用"$apps"
,或仅使用普通$apps
,这会将列表中的每个单词留作单独的标记。 (如果您的文件名或路径中有空格,则1个路径/文件现在是2个单词,并且会导致问题)。还有一些数组符号可供使用,apps=( $(ls | grep Adobe) )
,并使用${#apps[@]}
(元数),${apps[@]}
(所有元素),${apps[1]},
(第一元素)等变量可能的。
另外,目前还不清楚你对add .bak extension
的意图是什么。我最好的猜测是我的第二个选项/bin/mv ... .bak
。
IHTH。
答案 1 :(得分:0)
首先,在给出的示例中,原始帖子中存在拼写错误。您要重命名/替换的文件夹是amtlib.framework, not framwork 。
其次,出于某种原因,.bak目录存在的测试对我来说不起作用,即使我将其拆分为单独的if-then语句也不起作用:
cd /Applications
for x in *Adobe* ; do
printf "$x \n"
printf "%s" " "
if [ -d "$x/$x.app/contents/frameworks/amtlib.framework.bak" ]; then
printf "removing old bak... "
fi
if [ -d "$x/$x.app/contents/frameworks/amtlib.framework" ]; then
printf "moving... "
printf "copying... "
printf "%s\n" "done!"
else
printf "%s\n" "nothing to do here!"
fi
done
cd ~
最后,了解目标后,您将无法更新具有其他文件夹级别的几个应用程序(例如,Acrobat Pro和Illustrator)。