Comando Linux: encontre um nome de programa e execute os programas

1

Como faço para encontrar um programa em um diretório e subdiretórios e, em seguida, executar os programas?

Por exemplo,

find . -type f -name "abc" 

localiza todos os executáveis do abc e:

find . -type f -name "abc" | RUN "abc" -p (WRONG!!!)

executa os programas abc com um parâmetro "-p".

Como posso alcançá-lo?

    
por Matt Elson 08.03.2017 / 10:51

3 respostas

2

Existem várias maneiras, cada uma mais voltada para uma necessidade específica. Bem-vindo ao mundo do UNIX.

Isso executa os comandos por meio de nohup :

find . -type f -name 'abc' | xargs -I '{}' nohup '{}' -p

Explicação :

find . procura no diretório atual e nos subdiretórios.

-type f procura por um arquivo.

-name 'abc' o nome do arquivo deve ser exatamente "abc" (diferencia maiúsculas de minúsculas).

| canaliza a lista resultante de arquivos para outro programa.

xargs envia as entradas individuais para outro programa.

-I '{}' na expressão a seguir, substitua '{}' pela entrada.

nohup este é o programa que xargs chamará várias vezes, sempre passando um dos resultados find como um parâmetro. Este programa é usado para iniciar tarefas que serão executadas em segundo plano e não serão interrompidas se a sessão atual for desconectada. Para permitir que você verifique os resultados, a saída dos comandos executados através de nohup é, por padrão, anexada ao arquivo nohup.out no diretório atual.

'{}' , este é um marcador de posição e será substituído pelos resultados find .

-p , isso será adicionado como um parâmetro adicional.

Exemplo: digamos que você tenha um arquivo chamado "abc" na pasta atual e outro em uma subpasta chamada "sub"; os comandos que serão executados são:

nohup ./abc -p
nohup ./sub/abc -p

Nota: pode ser útil executar xargs -p , pois ele exibirá cada comando antes de executá-lo. Responder y irá realmente lançá-lo, n irá ignorá-lo ( find . -type f -name 'abc' | xargs -p -I '{}' nohup '{}' -p ).

Ou usando sudo :

find . -type f -name 'abc' | xargs -I '{}' sudo -u $USER '{}' -p

sudo executa um comando e permite escolher o usuário para o qual ele deve ser executado. Neste exemplo, ele usa o usuário atual, cujo nome é encontrado na variável de ambiente $USER .

Ou usando bash (ou seu shell favorito):

find . -type f -name 'abc' | xargs -p -I '{}' bash -c "'{}' -p"

Aqui os comandos são passados para o bash, mas você pode optar por executá-los com um shell diferente (se você tiver instalado, é claro). Basta substituir bash por sua escolha de sh , csh , tcsh , ksh , zsh ...

Ou usando parallel :

find . -type f -name 'abc' | parallel --no-notice -I '{}' "'{}' -p"

parallel geralmente não é instalado por padrão, mas pode valer a pena usar; pense nisso como um xargs aprimorado (ele é escrito para funcionar com as mesmas opções) que tem o recurso útil de poder executar as entradas que ele recebe em vez de sempre precisar passá-las para outro programa (pelo menos, eu não era Não é possível obter xargs para fazer isso). Como o próprio nome sugere, os comandos são, por padrão, executados em paralelo maximizando a utilização de cpu / thread. A opção --no-notice oculta a citação que sempre mostra até ser executada com --bibtex .

Ou com at :

find . -type f -name 'abc' | xargs -I '{}' echo '{}' -p | at now

at agenda um comando para ser executado na hora especificada; neste exemplo now é usado para executar os comandos imediatamente.

    
por 08.03.2017 / 11:11
1
find . -type f -name "abc" | xargs -I'{}' echo '{}' -p  | bash

ou

find . -type f -name "abc" | sed 's/$/ -p/' | bash

Ambos os comandos primeiro listam os arquivos que receberam o nome "abc" antes do primeiro pipe. Entre o primeiro e o segundo pipe, ambos os comandos anexam o parâmetro -p após cada linha. Finalmente, após o segundo pipe, esses comandos "abc" são enviados para bash para execução.

    
por 08.03.2017 / 11:12
0

Eu simplesmente rodaria isso:

find . -type f -iname 'abc' -executable -execdir '{}' -p \;

Isso executará todos os arquivos executáveis abc sequencialmente, com -p argumento a cada vez.

Detalhes :

  • . Pesquisa na pasta atual e nas subpastas
  • -type f apenas arquivos
  • -iname abc Restrição do nome do arquivo (case i nsensitive)
  • -executable Restringir a arquivos executáveis
  • -execdir ... \; Execute um comando (exec) para cada arquivo correspondente (\;) , com o diretório de trabalho definido como a pasta de arquivos correspondente (dir)
    • '{}' Espaço reservado substituído pelo arquivo executável correspondente (ex: "./abc")
    • -p Argumento dado ao arquivo executável
por 19.03.2017 / 14:28