需要帮助编写bash脚本来移动文件夹

时间:2012-12-22 01:32:25

标签: macos bash unix directory loops

我需要做的是将文件夹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脚本实现?

2 个答案:

答案 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)。