2010-04-20 2 views

Répondre

3

J'aime

ls | xargs cat 

pour sa sensation de langage fonctionnel. YMMV.

+0

Comment diable n'ai-je jamais entendu parler de cela avant? +1 – Beta

3

En supposant que votre programme peut accepter un nom de fichier comme premier argument de ligne de commande, d'une façon est d'utiliser find pour trouver tous les fichiers dans le dossier, puis utilisez xargs pour exécuter votre programme pour chacun d'eux:

find myFolder | xargs -n 1 myProgram.py 

le -n 1 signifie « exécuter le programme une fois par fichier ». Si votre programme est heureux de recevoir plusieurs noms de fichiers sur la ligne de commande, vous pouvez omettre le -n 1 et xargs exécutera votre programme moins de fois avec plusieurs fichiers sur la ligne de commande.

(find va faire une recherche récursive, de sorte que vous obtiendrez tous les fichiers et sous myFolder. Vous pouvez utiliser find myFolder -maxdepth 1 pour empêcher cela.)

(Merci à @Personman de remarquer que cette exécutera le programme pour le dossier lui-même, ainsi que les fichiers que vous pouvez utiliser find myFolder -type f dire find seulement retourner les fichiers réguliers)

+0

Il faut faire attention à trouver. Tout d'abord, vous avez besoin de la barre oblique dans 'find myFolder /'. En second lieu, sachez que find renvoie le dossier lui-même, ainsi que tout son contenu, et à moins que vous n'utilisiez -maxdepth, il le fait aussi récursivement. Trouver est assez compliqué; vous devriez d'abord lire sa page de manuel. – Personman

+0

On dirait que l'overkill est basé sur l'OP. – dawg

0

cat myFolder/* | myProgram.py

+0

est-ce que cela lance myProgram une fois pour chaque fichier dans myFolder? –

+0

@Sanjay: non, cela concaténera tous les fichiers dans un flux que myProgram.py verra sur stdin. Si l'OP veut que myProgram.py soit invoqué une seule fois pour chaque fichier, il doit l'indiquer dans sa question, et l'une des réponses find/xargs serait alors plus appropriée dans ce cas. –

1

que diriez-vous:..

for x in myFolder/* 
do 
cat $x | myProgram.py 
done 
0

ou cat *.xml | myProgram.py qui produira la sortie de chaque fichier. Cela combine tous les fichiers en un seul flux.

myProgram.py *.xml va développer tous les noms de fichier en entrée de votre programme comme ceci: myProgram.py file1.xml file2.xml file3.xml ... filen.xml Chaque fichier reste séparé et le script peut se distinguer les uns des autres.

Les scripts Python/Perl/sh, en cas de base, gèrent généralement le même que myProgram.py file1.xml; myProgram.py file2.xml; myProgram.py filen.xml avec la nouvelle commande ;.

Jouez avec lui et bienvenue à Unix!

1

Si vous essayez simplement d'exécuter votre programme de données sur un tas de fichiers, le moyen le plus simple/le moins compliqué est d'utiliser -exec dans find.

que vous vouliez exécuter des données sur tous les fichiers txt dans le répertoire courant (et sous-répertoires).Ceci est tout ce que vous aurez besoin:

find . -name "*.txt" -exec data {} \; 

Si vous voulez limiter au répertoire courant, vous pouvez le faire:

find . -maxdepth 1 -name "*.txt" -exec data {} \; 

Il y a beaucoup d'options avec find.

Questions connexes