【问题标题】:Need help writing bash script to move folders around需要帮助编写 bash 脚本来移动文件夹
【发布时间】:2012-12-09 13:43:59
【问题描述】:

我需要做的是将文件夹 amtlib.framework 替换到我 Mac 上的每个 Adob​​e 应用程序中

如果我这样做: 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 脚本?

【问题讨论】:

    标签: macos bash unix directory loops


    【解决方案1】:

    类似

    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=$(ls | grep Adobe)
    

    根据具体情况,您可能需要使用"$apps",或者只是简单的$apps,这会将列表中的每个单词作为单独的标记。 (如果您的文件名或路径中有空格,则 1 路径/文件现在是 2 个单词,并且会导致问题)。还可以使用数组表示法apps=( $(ls | grep Adobe) ),并可以使用${#apps[@]}(元素数量)、${apps[@]}(所有元素)、${apps[1]},(第一个元素)等变量。

    此外,尚不清楚您使用add .bak extension 的目的是什么。我最好的猜测是我的第二个选项,/bin/mv ... .bak

    IHTH。

    【讨论】:

    • 只有一条评论:不要解析ls的输出。改用 glob:for x in *Adobe*; do
    【解决方案2】:

    首先,原始帖子中有一个拼写错误,该错误贯穿于给出的示例中。您要重命名/替换的文件夹是 amtlib.framework,不是框架

    其次,由于某种原因,.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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      相关资源
      最近更新 更多