2010-03-25 5 views
2

J'ai un répertoire et il contient plusieurs fichiers. J'essaie de décrypter ces fichiers et de les déplacer dans un autre répertoire. Je n'arrive pas à comprendre comment définir le nom de fichier de sortie et le déplacer.Script shell pour décrypter et déplacer des fichiers d'un répertoire vers un autre répertoire

Ainsi, la structure de répertoire se présente comme suit:

/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/ 

Pour tous les fichiers qui se trouvent dans le répertoire crypté, je suis en train de les déchiffrer et les déplacer dans le répertoire www/déchiffré /. Je ne sais pas quels seront les noms de fichier dans le répertoire crypté à l'avance (ce script finira par fonctionner par cron), donc je voulais simplement sortir les fichiers déchiffrés avec les mêmes noms de fichiers, mais sans le pgp. Donc, le résultat serait:

/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 

Donc, c'est tout ce que j'ai écrit jusqu'à présent et cela ne fonctionne pas. FILE et FILENAME ont tous les deux tort. Je ne suis même pas arrivé à la partie mobile.

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 

Répondre

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

J'ai essayé d'utiliser ceci, mais je continue à obtenir: gpg:/Applications/MAMP/bin/encrypted /: erreur de lecture: Est un répertoire gpg: decrypt_message échoué: eof – KittyYoung

+0

Oh, attendez ... vous changé :) Laissez-moi essayer à nouveau ... – KittyYoung

+0

C'est parfait! Merci beaucoup.Je ne comprends absolument pas la plupart de la syntaxe, mais je vais certainement essayer de comprendre ce que tout cela signifie ... – KittyYoung

0

Cela devrait résoudre les problèmes de FILENAME et FILE, bien qu'il ne fonctionnera que si vous êtes dans le répertoire « déchiffré » en ce moment. Si vous voulez fixer que vous devrez ajouter le répertoire approprié à la variable 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

J'aime faire cd premier:

cd /Applications/MAMP/bin/encrypted/ 

Puis

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

ou

for FILE in `ls`; do ... 

Personnellement, je préfère:

ls | while read FILE; do ... 

Alors peut-être

cd - 

Important: Si vous utilisez l'approche ls, assurez-vous que vos noms de fichiers ne contiennent pas d'espaces. Voir aussi le lien dans le commentaire de ghostdog74 (merci, BTW) - cette page est généralement très utile.

+0

utilisation inutile de 'ls' – ghostdog74

+0

@ ghostdog74: Peut-être que vous avez raison, mais en utilisant ls a quelques avantages: 1) Vous ne doivent pas utiliser basename pour se débarrasser du chemin inutile. 2) Vous pouvez utiliser toutes les options de ls, et même le faire passer par d'autres outils avant d'utiliser les valeurs. –

+1

L'utilisation de 'ls' dans une boucle for n'a aucun avantage. vous fourchez un autre processus et son enclin à l'erreur si les noms de fichiers ont des espaces blancs. Comme pour 2), vous n'avez pas utilisé 'ls -l', donc il n'y a pas d'options pour parler de – ghostdog74

Questions connexes