Comment ouvrir plusieurs fichiers à partir de la sortie `find`?

10

Je sais que je peux ouvrir plusieurs fichiers trouvés dans un répertoire comme ceci:

find -name *.foo -xargs <command> {} \;

Cela fonctionne, mais lorsque vous essayez d'ouvrir un tas de fichiers texte dans gedit en même temps, il les ouvre successivement (lorsqu'un fichier est fermé, le suivant est ouvert).

Je voudrais ouvrir tous ces fichiers en même temps. Comment puis-je atteindre cet objectif?

jottr
la source

Réponses:

15

Pour agir sur plusieurs fichiers à la fois avec find, utilisez à la +place de \;:

find . -name '*.foo' -exec gedit {} +

Avec zsh, ou avec bash ≥4 si vous insérez shopt -s globstarvotre ~/.bashrc, vous pouvez utiliser **/pour recurse dans les sous-répertoires:

gedit **/*.foo

Zsh possède également de nombreux qualificatifs glob qui peuvent remplacer la plupart des utilisations de find.

Gilles 'SO- arrête d'être méchant'
la source
quelqu'un pourrait-il suggérer comment l'exécuter sur Mac OS X?
andilabs
@andi résolu par moi-même. Mais si quelqu'un propose quelque chose de plus court, ou de forcer SublimeText à s'ouvrir dans des onglets séparés, plutôt que dans des fenêtres, ce sera très apricié.
andilabs
@andi Il s'agit d'un problème avec SublimeText, vous devez le demander en tant que thread séparé.
Gilles 'SO- arrête d'être méchant'
Quoi qu'il en soit, je pense qu'il s'agit du format bash exact, car si je lance par exemple, open -a SublimeText admin.py forms.pyil s'ouvre dans une fenêtre avec deux onglets.
andilabs
2

Sur Mac OS X bash, vous pouvez exécuter quelque chose comme:

for file in $(find . -name "*.py"); do open -a SublimeText $file; done. 

Un inconvénient est qu'il s'ouvre dans une nouvelle fenêtre de Sublime au lieu d'utiliser un nouvel onglet.

andilabs
la source
0

Je pense que dans ce cas, vous pourriez utiliser

find ./ -name \*.foo | xargs gedit
pbm
la source
1
Cela ne fonctionnera pas si le nom de fichier contient des caractères spéciaux (espaces ou \'"), car il xargsnécessite que son entrée soit citée d'une manière qui findne produit pas. Soit utiliser find … -print0 | xargs -0 …, soit utiliser le plus simple find … -exec … {} +.
Gilles 'SO- arrête d'être méchant'
De plus, bien que cela ne s'applique pas dans ce cas, -print0 | xargs -0le problème est que stdin a été englouti et n'est plus attaché au terminal. Un problème si vous essayez d'utiliser un éditeur en mode texte.
derobert