作为OSX应用程序的Bash脚本等待删除的文件

时间:2013-06-30 17:54:11

标签: macos shell

我写了一个bash脚本,我使用Platypus变成了一个应用程序。我选择了Platypus,所以我可以轻松使用Droplet选项。

基本思路是从用户那里获取一个zip文件,解压缩文件,排除我们不会使用的几个文件,重新压缩新文件并将它们移动到桌面上的文件中。当我运行应用程序时,脚本不会等待用户删除文件。它运行并发出错误,没有找到.zip。

我有几个问题。

如何让我的应用程序等待将zip文件放在Droplet上?

文件在哪里由Platypus存储,如何在脚本中调用它?

这是我到目前为止所做的。

unzip *.zip -x *.cpg *.xml *.txt -d Processed
cd NavtecProcessed
zip -r * *
echo "Cleaning up your mess"
mkdir ~/Desktop/Final/
mv ./*zip ~/Desktop/Final/
sleep 2
cd ..
rm -r NavtecProcessed*
echo "All done!"

从数据文件夹在终端中运行时,脚本可以正常工作。任何帮助/指导将不胜感激。

1 个答案:

答案 0 :(得分:2)

您可能需要对脚本进行一些小的调整,以使其与Platypus Droplet处理删除文件的方式兼容。

这里有关于液滴如何工作的细分:

  • 首次启动应用程序时,脚本将运行一次
  • 当您将文件放入Droplet时,脚本将以删除的文件作为参数运行

因此问题的解决方案是重构脚本来处理传递的参数。您可以在bash中使用$#作为参数总数,并使用$1, $2, $3 ...等其他参数。您也可以使用$*来使用所有参数。

这是一个示例脚本,它将输出Droplet看到的传递文件的文件名(在applescript警报中)。请注意,如果传递了0个参数($# -eq 0),则退出if语句:

    #!/bin/sh

    if [ $# -eq 0 ]
    then
        exit 0
    fi

    `/usr/bin/osascript << EOT
    tell app "System Events"
         display dialog "$# argument(s): $*"
    end tell                           
    EOT`

正如您所说,您的脚本当前似乎对您当前所在的文件夹进行操作。一个简单的mod可能满足您的需求:

if [ "$#" -ne 1 ]
then
    exit 0
fi

cd $1
unzip *.zip -x *.cpg *.xml *.txt -d Processed
cd NavtecProcessed
zip -r * *
echo "Cleaning up your mess"
mkdir ~/Desktop/Final/
mv ./*zip ~/Desktop/Final/
sleep 2
cd ..
rm -r NavtecProcessed*
echo "All done!"

此脚本将删除的文件夹,cd放入其中,然后执行原始脚本。如果没有通过一个参数(文件夹),那么它什么都不做。

:)希望这有帮助!