2013-04-30 2 views
1

Le dossier actuel contient des sous-dossiers, dont chacun contient entre autres un fichier que je veux traiter.Correspondance de motif Bash: exclure une chaîne donnée

Fichiers Je suis intéressé par ressembler à:

someSubFolderCommonPathName*/*commonStringInFileName* 

Mon problème est que j'ai aussi des fichiers que je ne ai pas à traiter dont le nom est le même que ci-dessus et qui se terminent par _stringNotToMatch:

someSubFolderCommonPathName*/*commonStringInFileName*_stringNotToMatch 

Comment puis-je les exclure dans mon expression correspondant à motif?

Un exemple simple pourrait être:

for i in someSubFolderCommonPathName*/*commonStringInFileName*!(stringNotToMatch); do stat $i; done 

... mais il ne fonctionne pas.

Ok, si je simplifie furtherly cela, voici un exemple: je donne les résultats suivants:

[email protected]:~/a$ ls -R 
.: 
aPrettyBoy aPrettyGirl 

./aPrettyBoy: 
12cool21 12nice21 77nice77_ugly 

./aPrettyGirl: 
12cool21 12nice21 23nice23_ugly 

Et puis j'essayer de faire afficher tous les fichiers contenant nice en leur nom et non _ugly:

[email protected]:~/a$ for i in *Pretty*/*nice*!(_ugly); do echo $i; done 
aPrettyBoy/12nice21 
aPrettyBoy/77nice77_ugly 
aPrettyGirl/12nice21 
aPrettyGirl/23nice23_ugly 

Cela n'a pas fonctionné. Je vais inclure une étoile maintenant:

[email protected]:~/a$ for i in *Pretty*/*nice*!(*_ugly); do echo $i; done 
aPrettyBoy/12nice21 
aPrettyBoy/77nice77_ugly 
aPrettyGirl/12nice21 
aPrettyGirl/23nice23_ugly 

Toujours pas fonctionnant. avec find IcI:

[email protected]:~/a$ find . -path "*Pretty*/*nice*" ! -name "_ugly" -exec echo {} \; 
./aPrettyBoy/12nice21 
./aPrettyBoy/77nice77_ugly 
./aPrettyGirl/23nice23_ugly 
./aPrettyGirl/12nice21 

Nada.

Répondre

1

Le motif glob étendu négatif est un peu problématique. Simplifions un peu la situation: nous voulons *nice*, mais nous ne voulons pas ugly à la fin. Si nous entrons dans

*nice*!(ugly) 

alors tout contenant nice correspondra: l'astérisque avant le motif négatif mange le u aussi bien, et la gly à la fin n'est plus laid. De plus, les chaînes se terminant par nice ne correspondront pas.

Pour contourner ce problème, déplacer l'astérisque dans le modèle négatif:

*nice!(*ugly) 
+0

Dans mon cas, la partie avant et après 'nice' varie toujours. Les seules constantes sont «gentilles» quelque part au milieu et «_ugly» à la fin. J'ai essayé avec et sans '*' à l'intérieur des parenthèses, mais je reçois toujours ces fichiers non désirés ... –

+0

@RickyRobinson: S'il vous plaît montrer un exemple concret. – choroba

+0

OK, j'ai ajouté un exemple basé sur votre réponse. –

1

En utilisant find:

find . -path "./someSubFolderCommonPathName*/*commonStringInFileName*" ! -name "*_stringNotToMatch" -exec stat {} \; 
+0

Ça ne marche pas ... –

+0

Ça marche pour moi. Avez-vous exécuté exactement la même commande dans le répertoire contenant 'someSubFolderCommonPathName'? – dogbane

+0

J'ai ajouté un exemple avec aussi votre solution. Peut-on lui donner un coup d'oeil? Merci beaucoup! –

Questions connexes