2009-10-20 15 views
2

Chaque fois que la correspondance du modèle glob échoue, il arrête la totalité du travail. Par exemple,Dégradation gracieuse pour la globalisation sur le terminal

$ mv *.jpg *.png folder1 && blahblah 
mv: cannot stat `*.jpg': No such file or directory 

* .png n'est pas déplacé dans le dossier1 et blahblah n'est pas exécuté.

Et le script ci-dessous ne fonctionne que dans les cas où. [A-z] * et * réussissent. Comment est-ce que je fais grincer la globbing gracieusement, tout au plus affichant seulement des avertissements, mais n'arrêtant jamais le travail?

Répondre

5

Dans Bash, shopt -s nullglob permet à un glob défaillant de s'étendre à rien sans erreurs.

+1

nullglob résout la plupart du problème, mais pas tout à fait; Si aucun des globs ne correspond, vous obtenez quelque chose comme 'mv folder1 && blahblah' (vous obtenez un message d'utilisation de mv, et blahblah ne fonctionne pas). Le résoudre complètement est plus compliqué, en partie parce que vous devez définir ce qui devrait arriver s'il n'y a pas de fichiers à utiliser. Vous finissez par faire des choses comme 'file_list = (*. Jpg * .png); if [[$ {# file_list [@]} -gt 0]]; alors mv "$ {file_list [@]}" dossier1 && ... ' –

0

puis utilisez une boucle. KISS

for files in jpg png 
do 
    mv *.${files} /destination 2>/dev/null && do_something 
done 
+1

Non seulement cela est plus lent, mais il émet aussi' mv: ne peut pas stat '* jpg': Aucun fichier ou répertoire '. – ephemient

+0

s'il vous plaît regardez attentivement le tout avant de commenter. Je sais bien que c'est lent. mais il fait le travail. Une seule commande "mv * jpg * png folder && touch dummy" par exemple, ne fonctionnera pas selon le cas de l'OP. Mais si vous introduisez une boucle for, le fichier fictif sera créé car maintenant, nous faisons chaque type de fichier un par un. – ghostdog74

+0

pour l'erreur "can not stat", son trivial pour rediriger stderr vers/dev/null ... – ghostdog74