2017-02-10 19 views
0

Ниже приведен фрагмент сценария, над которым я работаю для резервного копирования мультимедиа. Сценарий выполняется, как ожидается, при вызове из командной строки терминала. Однако после переноса скрипта с Platypus в приложение создается целевой каталог, но цикл For Loop не запускается и медиафайлы не копируются в папку назначения. Кто-нибудь знает, что я делаю неправильно здесь?Для Loop Breaks после упаковки Platypus

#!/bin/sh 

DEST_PATH=/Volumes/MediaBackup 
mkdir -p $DEST_PATH  
SAVEIFS=$IFS 

IFS=$(echo -en "\n\b") 

for i in $(find "$PWD" -iname "*.jpg")  
do  
    FILENAME="$(basename $i)" 
    MD5="$(md5 -q $i)" 
    cp "$i" "$DEST_PATH/$MD5-$FILENAME" 
done 

IFS=$SAVEIFS 

Нежные парни и/или дамы, СПАСИБО! Ниже приведен рабочий сценарий с использованием ваших комментариев. Спасибо за быстрый поворот. Должно было сделать эти дни назад.

#!/bin/bash 

DEST_PATH=/Volumes/PrivateMain/Media 
mkdir -p $DEST_PATH 
SAVEIFS=$IFS 

IFS=$(printf "\n\b") 

for i in $(find "/Users" -iname "*.jpg") 
do 
FILENAME="$(basename $i)" 
MD5="$(md5 -q $i)" 

cp "$i" "$DEST_PATH/$MD5-$FILENAME" 

done 

IFS=$SAVEIFS 
+0

Возможно ли, что Platypus меняет ваш текущий рабочий каталог? Вы явно называете выходной каталог, поэтому нет никакой двусмысленности относительно того, куда это будет идти, но если бы '$ PWD' изменился, вы можете быть где-то там, где' find' появляется пустым. –

+1

Возможно, не связанный, но см. [Bash FAQ 001] (http://mywiki.wooledge.org/BashFAQ/001) для правильного пути итерации вывода 'find'. – chepner

+0

Похоже, что вы запускаете свой скрипт с 'bash' из командной строки, но он запускается с'/bin/sh' в версии, завершенной Platypus. 'echo' будет вести себя по-разному в каждом случае. (А именно, '-e' обрабатывается'/bin/sh' как строковая строка для вывода, а не опция для обработки экранированных символов.) Вместо этого используйте 'printf '\ n \ b'' для переносимого поведения. – chepner

ответ

0
#!/bin/bash 

DEST_PATH=/Volumes/PrivateMain/Media 
mkdir -p $DEST_PATH 
SAVEIFS=$IFS 

IFS=$(printf "\n\b") 

for i in $(find "/Users" -iname "*.jpg") 
do 
FILENAME="$(basename $i)" 
MD5="$(md5 -q $i)" 

cp "$i" "$DEST_PATH/$MD5-$FILENAME" 

done 

IFS=$SAVEIFS 

Спасибо всем, кто помог! Однако, из-за возможности перезаписи 2 одинаковых файлов, я отредактировал сценарий так, как показано ниже.

SAVEIFS=$IFS 
IFS=$(printf "\n\b") 
COUNTER=0; 
for i in $(find "/Users" -iname "*.jpg"); 
do 

BASE=`expr "$i" : '.*/\(.*\)\..*'`; 
EXT=`expr "$i" : '.*/.*\.\(.*\)'`; 
COUNTER=`expr $COUNTER + 1` ; 
cp "$i" ""${tardir}"/"$x"/JPG/"$BASE"_"$COUNTER"."$EXT"" 

done 
IFS=$SAVEIFS   
+0

Я думаю, вы хотите 'cp '$ i" "$ {tardir}/$ x/JPG/$ {BASE} _ $ COUNTER. $ EXT" '. – chepner