Como abrir vários arquivos da saída `find`?

10

Eu sei que posso abrir vários arquivos encontrados em um diretório da seguinte maneira:

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

Isso funciona, mas ao tentar abrir um monte de arquivos de texto no gedit ao mesmo tempo, ele os abre sucessivamente (quando um arquivo é fechado, o próximo é aberto).

Eu gostaria de abrir todos esses arquivos ao mesmo tempo. Como posso conseguir isso?

jottr
fonte

Respostas:

15

Para atuar em vários arquivos ao mesmo tempo find, use em +vez de \;:

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

Com zsh, ou com bash ≥4, se você colocar o shopt -s globstarseu ~/.bashrc, você pode usar **/para recursar em subdiretórios:

gedit **/*.foo

O Zsh também possui muitos qualificadores globais que podem substituir a maioria dos usos find.

Gilles 'SO- parar de ser mau'
fonte
alguém poderia sugerir como executá-lo no Mac OS X?
precisa saber é o seguinte
@andi resolvido sozinho. Mas se alguém propor algo mais curto, ou forçar o SublimeText a abrir em abas separadas, em vez de janelas, será muito apreciado.
precisa saber é
@andi Esse é um problema do SublimeText, você deve solicitá-lo como um tópico separado.
Gilles 'SO- stop be evil'
de qualquer maneira eu acho que é sobre o formato exato do bash, porque se eu executar, por exemplo, open -a SublimeText admin.py forms.pyele abre em uma janela com duas guias.
21413 andilabs #
2

No Mac OS X bash, você pode executar algo como:

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

Uma desvantagem é que ele abre em uma nova janela do Sublime em vez de usar uma nova guia.

andilabs
fonte
0

Eu acho que neste caso você poderia usar

find ./ -name \*.foo | xargs gedit
pbm
fonte
1
Isso não funcionará se o nome do arquivo contiver caracteres especiais (espaço em branco ou \'"), pois xargsrequer que sua entrada seja citada de uma maneira que findnão produza. Ou use find … -print0 | xargs -0 …ou use o mais simples find … -exec … {} +.
Gilles 'SO- stop be evil'
Além disso, embora não se aplique neste caso, -print0 | xargs -0tem o problema de que o stdin foi engolido e não está mais conectado ao terminal. Um problema se você estiver tentando usar um editor de modo de texto.
derobert