我已经使用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文件?
答案 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"