2010-03-25 3 views
2

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

Таким образом, структура каталогов выглядит следующим образом:

/Applications/MAMP/bin/decryptandmove.sh 
/Applications/MAMP/bin/passtext.txt 
/Applications/MAMP/bin/encrypted/test1.txt.pgp 
/Applications/MAMP/bin/encrypted/test2.txt.pgp 
/Applications/MAMP/htdocs/www/decrypted/ 

Для всех файлов, которые находятся в зашифрованном каталоге, я пытаюсь расшифровать их, а затем переместить их в каталог WWW/расшифрован /. Я не знаю, какие имена файлов в зашифрованном каталоге будут раньше времени (этот скрипт в конечном итоге будет выполняться через задание cron), поэтому я хотел просто вывести дешифрованные файлы с одинаковыми именами файлов, но без pgp. Таким образом, результат будет следующим:

/Applications/MAMP/bin/decryptandmove.sh 
/Applications/MAMP/bin/passtext.txt 
/Applications/MAMP/bin/encrypted/ 
/Applications/MAMP/htdocs/decrypted/test1.txt.pgp 
/Applications/MAMP/htdocs/decrypted/test2.txt.pgp 

Итак, это все, что я написал до сих пор, и оно не работает. FILE и FILENAME ошибаются. Я даже не добрался до движущейся части.

pass_phrase=`cat passtext.txt|awk '{print $1}'` 

for FILE in '/Applications/MAMP/bin/encrypted/'; 
do 
    FILENAME=$(basename $FILE .pgp) 
    gpg --passphrase $pass_phrase --output $FILENAME --decrypt $FILE 
done 

ответ

1
#!/bin/bash 
p=$(<passtext.txt) 
set -- $p 
pass_phrase=$1 
destination="/Applications/MAMP/htdocs/www/decrypted/" 
cd /Applications/MAMP/bin/encrypted 
for FILE in *.pgp; 
do 
    FILENAME=${FILE%.pgp} 
    gpg --passphrase "$pass_phrase" --output "$destination/$FILENAME" --decrypt "$FILE" 
done 
+0

Я пытался использовать это, но я продолжаю получать: gpg:/Приложения/MAMP/bin/encrypted /: ошибка чтения: есть каталог gpg: decrypt_message failed: eof – KittyYoung

+0

Ой, подождите ... вы изменил его :) Позвольте мне попробовать еще раз ... – KittyYoung

+0

Это прекрасно! Большое спасибо.Я полностью не понимаю большую часть синтаксиса, но я обязательно попытаюсь понять, что все это значит ... – KittyYoung

0

Это должно исправить FileName и FILE проблемы, хотя это будет работать только если вы находитесь в «расшифрованных» каталог прямо сейчас. Если вы хотите исправить, что вам придется добавить правильный каталог в переменную FILENAME :)

pass_phrase=`cat passtext.txt|awk '{print $1}'` 

for FILE in /Applications/MAMP/bin/encrypted/*; do 
    FILENAME=$(basename $FILE .pgp) 
    gpg --passphrase $pass_phrase --output $FILENAME --decrypt $FILE 
done 
0

Мне нравится делать cd первый:

cd /Applications/MAMP/bin/encrypted/ 

Тогда

for FILE in $(ls); do ... 

или

for FILE in `ls`; do ... 

Я лично предпочитаю:

ls | while read FILE; do ... 

Тогда, возможно,

cd - 

Важно: Если вы используете ls подход, убедитесь, что ваши имена файлов не содержат пробелов. См. Также ссылку в комментарии ghostdog74 (спасибо, BTW) - эта страница, как правило, весьма полезна.

+0

бесполезно использовать команду ls – ghostdog74

+0

@ ghostdog74: Может быть, вы правы, но с использованием Ls имеют некоторые преимущества: 1) Вы не должны использовать базовое имя, чтобы избавиться от ненужного пути. 2) Вы можете использовать все параметры ls и даже передавать его через другие инструменты перед использованием значений. –

+1

с использованием 'ls' в цикле for не имеет никаких преимуществ. вы переделываете другой процесс и склонны к ошибке, если имена файлов имеют пробелы. Что касается 2), вы не использовали 'ls -l', поэтому нет никаких опций, чтобы говорить о – ghostdog74

Смежные вопросы