Macos 需要帮助编写bash脚本来移动文件夹吗
我需要做的是将文件夹Macos 需要帮助编写bash脚本来移动文件夹吗,macos,bash,unix,directory,loops,Macos,Bash,Unix,Directory,Loops,我需要做的是将文件夹amtlib.framework替换到mac上的每个Adobe应用程序中 如果我这样做: cd/应用程序;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 //a
amtlib.framework
替换到mac上的每个Adobe应用程序中
如果我这样做:
cd/应用程序;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脚本
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
如果您的目录名中可能有空格,(不确定OSX是否支持-print0
),请尝试
find . -name 'Adobe' -print0 \
| while read x ; do
if ....
仅供参考,bash中的赋值如下(在=
周围没有空格):
根据当时的情况,您可能希望使用“$apps”
,或者只使用普通的$apps
,这会将列表中的每个单词作为单独的标记。(如果文件名或路径中有空格,则1 path/file现在是2个单词,并将导致问题)。还有一些数组符号可以使用,apps=($(ls|grep Adobe))
,并且可以使用像${{apps[@]}
(元素数),${apps[@]}
(所有元素),${apps[1]},
(第一个元素)这样的变量
另外,还不清楚您使用add.bak扩展的目的是什么。我最好的猜测是我的第二个选择,/bin/mv。bak
IHTH.首先,在给出的示例中,原始帖子中出现了一个打字错误。您要重命名/替换的文件夹是amtlib.framework,而不是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)。只有一条注释:不要解析ls
的输出。改用globs:表示*Adobe*中的x;执行
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 ~