2017-08-14 4 views
2

J'ai script shell alternatif qui filtre pour un fichier avec l'état comme ci-dessous:-C shell: foreach ls ne peut pas détecter le nom du fichier avec tableau de bord/trait d'union (-)

*_[+-]*[A-D]*.txt 

Exemple de fichier:

Reflow_-12_A124er.txt

Mon script comme ci-dessous:

#!/bin/csh -f 

cd /data 
foreach file (`ls *_[+-]*[A-D]*.txt`) 
echo "file: " $file 
gzip $file 
end 

Si je tente commande ls *_[+-]*[A-D]*.txt en d ata dossier, il y a sortie pour le fichier txt. Mais si j'essaie d'exécuter le script, le script ne détecte pas le fichier avec (-) même s'il rencontre le filtre. Pourquoi?

Répondre

0

Honnêtement, je ne comprends pas pourquoi, mais cela fonctionne:

foreach file (`ls *_[+--]*[A-D]*.txt`) 

Et donc ce ne:

foreach file (`ls *_[--+]*[A-D]*.txt`) 

Vous penseriez que je suis compris accidentellement le caractère , qui repose entre + et - sur la table ASCII, non? Nan. Le script n'a pas récupéré mon fichier d'exemple, Reflow_,77D123ab.txt. La documentation pour csh indique clairement que placer le tiret au début de la classe de caractères représentera un tiret littéral (et aussi que certaines versions de csh acceptent le tiret à la fin), mais c'est peut-être un bug à faire avec + étant un quantificateur, ou il a juste besoin de plus de 2 caractères dans la classe de caractères pour fonctionner correctement.

+0

cela fonctionne bien .. – larrey