2010-07-15 9 views
3

Je pensais juste avoir trouvé ma solution car la commande fonctionne dans mon répertoire de test.commande grep travaillant dans testdir mais pas dans le répertoire "réel"

grep -H -e 'author="[^"].*' *.xml | cut -d: -f1 | xargs -I '{}' mv {} mydir/. 

Mais en utilisant la commande dans le non-test direcory la commande ne fonctionne pas: Tel est le message d'erreur:

 
grep: unknown option -- O 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try `grep --help' for more information. 

Pas même cela a fonctionné:

$ grep -H author *.xml 

ou ceci:

$ grep -H 'author' *.xml 

(même message d'erreur)

Je soupçonne qu'il a une certaine relation avec les noms de fichiers ou la quantité de fichiers. J'ai près de 3000 fichiers dans le répertoire non-test et seulement 20 dans mon répertoire de test. Dans les deux répertoires, presque tous les noms de fichiers contiennent des espaces et "-".

Quelques infos:

  • J'utilise Cygwin.
  • Je ne suis pas autorisé à changer les noms de fichiers

Répondre

1

Essayez cette (mise à jour):

grep -HlZ 'author="[^"].*' -- *.xml | xargs -0 -I {} mv -- {} mydir/ 

EXPLICATION (mis à jour)

  • Dans votre répertoire "réel" vous avoir un fichier avec un nom commençant par -O. Votre shell développe la liste de fichiers *.xml et grep prend votre - en tant que nom de fichier (option non valide). La même chose arrive avec mv. Comme expliqué dans la section Common options de info coreutils, vous pouvez utiliser -- pour délimiter la liste d'options. Ce qui vient après -- est considéré comme un opérande, pas une option.

  • Utilisation de l'option de -l (minuscule L), grep sorties uniquement le nom du fichier de fichiers correspondant, de sorte que vous n'avez pas besoin d'utiliser cut.

  • Pour gérer correctement chaque nom étrange, vous devez utiliser la paire -Z dans grep et -0 dans xargs.

  • Pas besoin d'utiliser -e car votre modèle ne commence pas par -.

Espérons que cela aidera!

+0

Merci beaucoup pour les bons conseils! Une partie du problème est au moins résolue maintenant. Dieu nouvelles: grep ne se plaint pas et il trouve un fichier (avec ce nom horrible): !!dispositif Importation - être terminé later.xml Mauvaises nouvelles: grep ne répertorie pas tous les fichiers contenant la chaîne recherchée - par exemple ces fichiers commençant par tableau de bord simple, tableau de bord duouble et underscore triple: -OFF.xml --operation. xml ___Checklist - menu.xml Devrais-je faire quelque chose avec la variable IFS? /T – Tony

+0

@Tony: Je pense que 'grep' liste ces fichiers, le problème est' mv'. Vous devez aussi faire le tour '--' avec' mv'. Maintenant, je vais modifier la réponse pour résoudre le problème. Si cela fonctionne, veuillez accepter ma réponse! :) –

+0

Oui ça a marché! Bon!/T – Tony