Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 需要帮助编写bash脚本来移动文件夹吗_Macos_Bash_Unix_Directory_Loops - Fatal编程技术网

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 ~