Comment faire en sorte que wc interprète le standard comme une list de files

Je sais qu'il y a d'autres façons d'y parvenir, mais je cherche à pouvoir faire en sorte que wc interprète stdin comme un nom de file ou une list de noms de files. Par exemple,

 ls JP*/std* | wc 

fonctionnerait comme

 wc JP*/std* 

Je devine qu'il n'est pas possible d'ajuster ce comportement, mais je travaille sur un script où cela rend ma vie beaucoup plus facile. Merci.

Utilisez find en conjonction avec xargs . La seule raison pour laquelle je recommand de find est de tirer parti de l'option -print0 , qui sépare les noms de files par les NUL; Cela permet d'éviter les problèmes liés aux noms de files contenant des espaces.

 find . -maxdepth 1 -type f -print0 | xargs -0 wc 

Si vous voulez prendre la sortie d'une command et l'utiliser comme list de files d'input dans wc , vous pouvez probablement faire quelque chose comme ceci:

 wc $(ls JP*/std*) 

Cela exécute ls JP*/std* et sa sortie est passée en argument à wc .

xargs peut également être utile pour vous, ici:

 ls JP*/std* | xargs wc 

Voir la page de manuel xargs pour plus de détails sur la façon dont il peut être utilisé, car il est assez flexible.

Après avoir lu votre commentaire

L'input peut provenir d'un file,

Si la list des files est déjà dans le file que vous avez, vous pouvez simplement ignorer la partie de search et utiliser uniquement la partie xargs .

Voir la page man de xargs .

Utilisez l'option -a de xargs pour transmettre le nom de file du file où est la list que xargs doit lire.

Si les noms de files à l'intérieur de la list ne sont pas un nom de file complet, il ne suffit pas de le transmettre à wc car il n'y a pas de directory, vous pouvez éditer le file afin que le path complet soit inclus (vous devriez pouvoir le faire sans le modifier manuellement , en utilisant sed ou awk ou similaire).

Ou vous pouvez utiliser le mécanisme de rlocation de string dans xargs (option -I dans xargs ) (notez que si vous utilisez cette dernière méthode avec -I replacement, chaque ligne invoquera un programme différent et qu'il y a des limitations sur la longueur maximale – voir la page de man pour plus de détails)

Si votre input provient d'un file (et donc vous ne pouvez pas utiliser le mécanisme fourni par l'option -0 de xargs ), vous devez faire très attention s'il y a de l'espace ou d'autres caractères étranges dans le nom du file. Si vous devez find un moyen d'éviter un résultat inattendu.

Par exemple si vous avez un file nommé "mon document.txt" et dans votre list est écrit comme

 my document.txt 

et puis il est passé comme il est écrit dans le file, vous obtiendrez que ce qu'il est exécuté est

 wc my document.txt 

et cela se traduirait par un programme wc search de deux files, l'un nommé my et un nommé document.txt

Vous devriez être sûr que ce qui est passé est quelque chose comme

 wc "my document.txt" 

ou

 wc my\ document.txt 

(La première méthode peut être plus simple si vous utilisez déjà le mécanisme de rlocation, le second si vous modifiez déjà votre file.)

Eh bien, si vous le pouvez, il est peut-être plus simple de modifier le file d'input pour que chaque élément soit séparé par un caractère nul et que vous -0 option -0 de xargs .