2017-01-11 13 views
1

Я создал службу macOS с Automator, которая на самом деле будет прикреплять каждый файл из Finder к новому окну составления Thunderbird и является просто простым сценарием bash.Как определить, является ли файл папкой в ​​скрипте bash на macOS?

for f in "[email protected]" 
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 

Но как я могу определить, является ли файл в папке и чем сжать его в почтовый файл в сценарии баш?

+0

См .: 'help test | less' – Cyrus

ответ

0

Эта команда [ -f "$filename" ] возвращает истину для файлов, в то время как [ -d "$dirname" ] возвращает истину для каталогов.

Я бы предложил также проверить файл, потому что у вас могут быть вещи, которые не являются ни каталогами, ни файлами.

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, и если аргумент ни один из них, вы все равно можете выполнить определенную команду/скрипт (в примере выше myCommandNotFileDirectory).

Примечание: Я включил проверку на пустую строку, даже если это не был задан вопрос по этому вопросу, потому что это «качество/ошибка» Контрольное испытание я обычно делаю - переменная "$fileDirectory" никогда не должно быть пустым в этом контексте, и если это так, я хотел бы знать, что (это покажет мне, что скрипт работает неправильно), и поэтому я обычно перенаправлял эту команду в файл журнала, например:

elif [ -z "$fileDirectory" ]; then somecommand && echo "empty fileDirectory string ocurred" >> /var/log/mylog; 
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" 

ИЛИ

[ -d "$f" ] 

Чтобы проверить, является ли файл обычным файлом:

test -f "$f" 

ИЛИ

[ -f "$f" ] 

Редактировать: Цитированные переменные в образце кода, чтобы избежать чередования и разбиения слов.