2009-12-02 9 views
1

J'ai un répertoire comme celui-ci:Comment ajouter tous les fichiers dans les actuels et les sous-répertoires en tant qu'arguments de commande?

dir 
dir/somefile.txt 
dir/subdir/subsub/somefile2.txt 
dir/subdir2/somefile.txt 

et je veux ouvrir tous les fichiers dans tous les sous-répertoires en une seule instance d'une commande. J'essayais de trouver avec -exec, ou xargs, mais ceux-ci ouvrent chaque fichier avec une instance distincte d'une commande.

Fondamentalement, je veux quelque chose qui finit comme kate dir/somefile.txt dir/subdir/subsub/somefile2.txt dir/subdir2/somefile.txt, mais pour un certain nombre de fichiers dans un certain nombre de sous-répertoires. J'utilise bash, mais toutes les suggestions de script sont bien.

précision: je ne signifie pas seulement les fichiers txt, mais tout fichier ascii (c.-à-.php, .TXT, .html, etc ...)

+0

Tous les fichiers des sous-répertoires ont-ils l'extension '.txt' ou y a-t-il des fichiers que vous ne souhaitez pas ouvrir? Par exemple, s'il y a des fichiers PDF dans le répertoire, kate ne pourrait rien faire de significatif avec eux. Aussi, est-ce seulement '.txt' que vous voudriez ouvrir, ou voudriez-vous aussi ouvrir un '.sh', par exemple? – Grundlefleck

+0

** xargs ** ne sera exécuté qu'une fois par défaut. C'est la meilleure option que vous auriez dû poster ce que vous avez essayé, par exemple: ** trouver. -name '* .txt' -print0 | xargs -0 -r kate ** – NVRAM

Répondre

3

Essayez

kate `find . -name \*.txt -type f` 

où le -type f vous empêche de frapper les répertoires.

Voici un exemple en utilisant ls -1 au lieu de kate:

[email protected]:~/src/debian/R$ ls -1 `find . -type f -name \*.txt` 
./R-2.10.0/src/extra/graphapp/readme.txt 
./R-2.10.0/src/extra/xdr/copyrght.txt 
./R-2.10.0/src/extra/xdr/README.txt 
./R-2.10.0/src/gnuwin32/fixed/etc/rgb.txt 
./R-2.10.0/src/gnuwin32/installer/CustomMsg.txt 
./R-2.10.0/src/library/grid/inst/doc/changes.txt 
./R-2.10.0/src/unix/system.txt 
./R-2.9.2-ra-1.2.8/src/extra/graphapp/readme.txt 
./R-2.9.2-ra-1.2.8/src/extra/xdr/copyrght.txt 
./R-2.9.2-ra-1.2.8/src/extra/xdr/README.txt 
./R-2.9.2-ra-1.2.8/src/gnuwin32/fixed/etc/rgb.txt 
./R-2.9.2-ra-1.2.8/src/gnuwin32/installer/CustomMsg.txt 
./R-2.9.2-ra-1.2.8/src/library/grid/inst/doc/changes.txt 
./R-2.9.2-ra-1.2.8/src/unix/system.txt 
[email protected]:~/src/debian/R$ 

et si vous voulez vraiment tous les fichiers dans les sous-répertoires l'appel simplifie à

kate `find . -type f` 

si vous êtes dir/ ou bien

kate `find dir -type f` 
+0

+1 Depuis que je suis venu avec la même solution (supprimé ma réponse depuis que j'étais en retard). – ChristopheD

+0

Les notes en bas de page! Agréable! – naught101

+1

Les backquotes sont les mêmes que '$()' dans bash, et les '$()' sont plus faciles à imbriquer, si jamais vous en avez besoin. –

2

kate $(find dir -type f)

+0

probable devrait être 'kate $ (trouver dir -type f)' sauf si vous voulez que kate édite les répertoires. – Rudedog

+0

En outre, il ouvrira * tous * les fichiers avec Kate, éventuellement en ouvrant des fichiers contenant des données binaires, par ex. PDFs. – Grundlefleck

+0

donc -type f, n'est-ce pas Grundlefleck? – naught101

3

Il y a plusieurs options possibles pour cela. Ces réponses sont basées sur votre scénario où vous savez que tous les fichiers peuvent être ouverts par kate, et que vous voulez ouvrir des fichiers avec n'importe quelle extension.

find dir -type f -exec kate {} + 

kate $(find dir -type f) 

kate `find dir -type f` 

Les deuxième et troisième formes sont presque équivalentes. La principale différence [1] est que la première version va gérer les fichiers avec des espaces dans leur nom, alors que la deuxième et la troisième ne le font pas.

[1] Merci de m'avoir signalé cette NVRAM, je ne me suis pas rendu compte quand j'ai posté la réponse.

+0

votre premier, en utilisant la commande find "ouvrira" kate pour chaque fichier .txt. Les 2ème et 3ème choix sont meilleurs ... – ghostdog74

+0

@Grundleflek - les 2ème et 3ème formes ne gèrent pas les fichiers w/espaces dans les noms. @ levislevis85 - la première forme est la meilleure - si la version de find supporte la variante ** + **. – NVRAM

+0

@ levislevis85 - finissant 'find' avec ';' a donné ce comportement, j'ai trouvé quand je l'ai terminé avec '+' tous les fichiers ont été ouverts dans une instance de kate. – Grundlefleck

0

Vous n'êtes pas non plus t très familier avec xargs, ou vous ne l'utilisez pas correctement, car ce que vous essayez de faire est exactement le problème xargs est conçu pour résoudre: Étant donné une liste arbitrairement longue de chaînes, passez-les comme arguments à un programme en autant d'exécutions que possible sans dépasser les limites du système sur le nombre d'arguments qu'un programme peut prendre. Vous avez raison pour find ... -exec, mais cela peut également être corrigé. Il suffit d'ajouter + à la fin de la commande find et voilà, il se comporte comme xargs.

Aucune des solutions ci-dessus qui utilisent kate $(...) (ou l'équivalent avec des guillemets) ne fonctionne en général (elles ne supportent pas les noms de fichiers avec des espaces, ne fonctionneront pas du tout si la liste de fichiers est très longue). Les deux find ... + et xargs contourner ces limitations.

+0

En fait, le 'find' avec ** + ** est * meilleur * que' xargs' puisque le programme lancé peut utiliser une entrée standard (probablement le terminal). En cours d'exécution 'trouver ... | xargs vi' échouera, mais 'find ... -exec vi '{}' +' devrait fonctionner. – NVRAM

+0

Les processus lancés par 'xargs' peuvent également utiliser une entrée standard. Ce que vous vouliez probablement dire, c'est que leur entrée standard n'est pas un pseudo-terminal, et vous avez raison. Pour ce cas particulier (et extrêmement rare), 'find +' est ce que vous voulez. Dans tous les autres cas, 'xargs' est * beaucoup * meilleur en raison de sa flexibilité (par exemple, vous pouvez spécifier le nombre maximal d'arguments ou de caractères dans chaque ligne de commande). – Idelic

+0

Je pensais en fait à la gymnastique descripteur pour que les processus lancés par 'xargs' lisent stdin, mais je ne peux pas vraiment le faire fonctionner. Donc, effacez les deux premières phrases de mon commentaire précédent et le reste s'applique toujours. – Idelic