2010-07-25 11 views
2

J'écris le script suivant pour copier les fichiers * .nzb dans un dossier pour les mettre en file d'attente pour le téléchargement.script bash pour copier des fichiers entre les répertoires

j'ai écrit le script suivant

#!/bin/bash 

#This script copies NZB files from Downloads folder to HellaNZB queue folder. 

${DOWN}="/home/user/Downloads/" 
${QUEUE}="/home/user/.hellanzb/nzb/daemon.queue/" 


for a in $(find ${DOWN} -name *.nzb) 
do 
cp ${a} ${QUEUE} 
rm *.nzb 
done 

il me donne l'erreur suivante en disant:

HellaNZB.sh: line 5: =/home/user/Downloads/: No such file or directory 
HellaNZB.sh: line 6: =/home/user/.hellanzb/nzb/daemon.queue/: No such file or directory 

chose est que ces répertoires exsist, j'ai droit d'y accéder.

Toute aide serait bien.

S'il vous plaît et merci.

+1

Vous pouvez le simplifier un peu avec un '-exec' dans la find:' find $ DOWN -name * .nzb -exec mv {} $ QUEUE \; '. – SiggyF

Répondre

7

Les noms de variables sur le côté gauche d'une affectation doivent être nus.

foo="something" 
echo "$foo" 

Voici quelques améliorations à votre script:

#!/bin/bash 

#This script copies NZB files from Downloads folder to HellaNZB queue folder. 

down="/home/myusuf3/Downloads/" 
queue="/home/myusuf3/.hellanzb/nzb/daemon.queue/" 

find "${down}" -name "*.nzb" | while read -r file 
do 
    mv "${file}" "${queue}" 
done 

Utilisation while au lieu de for et citant variables contenant les noms de fichiers protège contre les noms de fichiers qui contiennent des espaces d'être interprétés comme plus d'un nom de fichier. La suppression du rm l'empêche de générer des erreurs à plusieurs reprises et de ne copier que le premier fichier. Le glob de fichier pour -name doit être cité. Habituellement, l'utilisation de noms de variables en minuscules réduit les risques de collisions de noms avec les variables shell.

Si tous vos fichiers sont dans un répertoire (et non dans plusieurs sous-répertoires) votre script entier pourrait être réduit à ce qui suit, par la voie:

mv /home/myusuf3/Downloads/*.nzb /home/myusuf3/.hellanzb/nzb/daemon.queue/ 

Si vous avez des fichiers dans plusieurs sous-répertoires:

find /home/myusuf3/Downloads/ -name "*.nzb" -exec mv {} /home/myusuf3/.hellanzb/nzb/daemon.queue/ + 

Comme vous pouvez le voir, il n'y a pas besoin d'une boucle.

+0

haha ​​qui était stupide de moi merci! Je ne pouvais pas comprendre quel était le problème pour la vie de moi. – myusuf3

+0

@garbagecollector: voir mon édition pour des conseils supplémentaires. –

+0

merci pour votre aide! :) – myusuf3

1

La syntaxe correcte est:

DOWN="/home/myusuf3/Downloads/" 
QUEUE="/home/myusuf3/.hellanzb/nzb/daemon.queue/" 
1
for a in $(find ${DOWN} -name *.nzb) 
    # escape the * or it will be expanded in the current directory 
    # let's just hope no file has blanks in its name 
do 
    cp ${a} ${QUEUE} # ok, although I'd normally add a -p 
    rm *.nzb   # again, this is expanded in the current directory 
        # when you fix that, it will remove ${a}s before they are copied 

done 

Pourquoi ne pas vous suffit d'utiliser rm $ (a}

Pourquoi utiliser une combinaison de cp et rm de toute façon, au lieu de mv?

-vous réaliser tous les fichiers se retrouveront dans le même répertoire et fichiers avec le même nom de répertoires différents écrasera les uns des autres

?

Que faire si le cp échoue? Vous allez perdre votre fichier.

+0

tous très vrai. Merci pour les commentaires! – myusuf3

Questions connexes