如何检测文件是否是macOS上的bash脚本中的文件夹?

时间:2017-01-11 21:59:13

标签: bash macos zip thunderbird

我已经使用Automator创建了一个macOS服务,它实际上会将Finder中的每个文件附加到一个新的Thunderbird撰写窗口,这只是一个简单的bash脚本。

    for f in "$@"
do
        open -a /Applications/Thunderbird.app/ "$f"
done

此服务也适用于任何文件夹,但您肯定无法将文件夹附加到撰写窗口。但我的想法是让脚本检测文件是文件还是文件夹。如果是文档,请附加它。如果它是一个文件夹,首先拉链压缩它,然后附加它。在路上:

if file is folder than
// zip compress folder
// attach *.zip to Thunderbird compose window
else // seems to be a document
// attach document to Thunderbird compose window

但是如何检测文件是否是文件夹而不是将其压缩为bash脚本中的zip文件?

4 个答案:

答案 0 :(得分:2)

if [[ -d "$file" ]]; then
  # do your thing for the directory
else
  # do the other thing for the file
fi

有关详细信息,请参阅此相关问题:How do I tell if a regular file does not exist in Bash?

答案 1 :(得分:2)

代码:

#!/bin/bash
if [ -d "$f" ]; then
    upload_file="$f.zip"
    # zip compress folder
    zip "$f.zip" "$f"
elif [ -f "$f" ]; then # seems to be a document
    upload_file="$f.zip"
else # Unknown file type
    echo "Unknown file type." 1>&2
    exit 1
fi
# attach file to Thunderbird compose window
open -a /Applications/Thunderbird.app/ "$upload_file"
exit 0

说明:
在bash中,“文件夹”被称为“目录”。您应该在测试时查看手册页。

$ man test

您的相关部分是:

NAME
 test, [ -- condition evaluation utility

SYNOPSIS
 test expression
 [ expression ]

...

 -d file       True if file exists and is a directory.

 -e file       True if file exists (regardless of type).

 -f file       True if file exists and is a regular file.

测试文件是否是目录:

test -d "$f"

OR

[ -d "$f" ]

测试文件是否是常规文件:

test -f "$f"

OR

[ -f "$f" ]

编辑:示例代码中的引用变量,以避免通配和分词。

答案 2 :(得分:0)

此命令[ -f "$filename" ]将为文件返回true,而[ -d "$dirname" ]将为目录返回true。

我建议也使用检查文件,因为你可能既不是目录也不是文件。

答案 3 :(得分:0)

我会这样接近:

if [ -d "$fileDirectory" ]; then myCommandDirectories;
elif [ -f "$fileDirectory" ]; then myCommandFiles;
elif [ -z "$fileDirectory" ]; then myCommandEmptyArgument;
else myCommandNotFileDirectory; fi

在上面的代码中,语法if [ -d ... ]将测试参数是否为directory,语法if [ -f ... ]将测试参数是否为file,语法if [ -z ... ]将测试参数是unset还是设置为empty string,如果参数不是那些,你仍然可以执行某个命令/脚本(在上面的例子中{ {1}})。

注意:我包括检查空字符串,即使在问题上没有询问,因为这是"质量/错误"控制测试我通常会这样做 - 变量myCommandNotFileDirectory在此上下文中永远不应为空,如果是,我想知道(它会告诉我脚本不能正常工作),因此我通常会将该命令重定向到日志文件,如下所示:

"$fileDirectory"