Como executar um programa executável com filtro

Como executar um programa executável com filtro

Eu quero executar um script de shell. Este script tem um nome longo. Então, eu quero usar filtro para arquivo.

ex:ls | grep myfile | ./

É possível executar um arquivo com filtro.

Responder1

Basta digitar:

*myfile*

Você também pode fazer:

"$(ls | grep pattern)"

se você corresponder completamente à expressão regular em vez de apenas curingas de nome de arquivo.

Todas essas soluções assumem que há apenas um único arquivo no diretório atual que corresponde ao padrão.

Responder2

Você pode usarxargspara esse tipo de coisa:

ls | grep myfile | xargs sh

xargslê as linhas em sua entrada e as fornece como argumentos para o programa fornecido como argumento: aqui, ele lerá a saída de grep e depois executará sh long_myfile_name. (Mude shpara bashse o seu script depender de recursos específicos do Bash ou de algum outro shell)

Você também pode executar sh *myfile*essencialmente o mesmo efeito neste caso simples - se grepfor mais complicado, talvez você não consiga fazer isso, mas sh "$(ls | grep ...)"funcionará.


Dito isto, existem alguns motivos pelos quais você pode não querer fazer isso: em particular, se for possível que em algum momento haja dois arquivos que correspondam ao seu arquivo grep. Nesse ponto, uma das três coisas acontecerá: seu script receberá um argumento extra, dois scripts diferentes serão executados ou outro script será executado. Você poderia, digamos, head -n 1evitar os dois primeiros, mas então um arbitrário será executado, o que não ajuda muito. Nesse $()caso, simplesmente falhará, o que é provavelmente o melhor de um conjunto ruim de resultados. Se houver espaços nos nomes dos arquivos você terá que tomar ainda mais cuidado.

A conclusão da guia do seu shell pode ser uma opção melhor: você provavelmente pode escrever *myfile*e pressionar TAB para obter uma expansão correta ou uma indicação de que há mais de uma possibilidade, ou até mesmo começar a escrever o nome e a guia completa até o final. Se você estiver executando isso em um script, basta colocar o nome completo lá – você só precisa escrevê-lo uma vez. A resposta acima da linha funcionará, mas eu realmente não a recomendo.

Responder3

você pode usar xargspor exemplo

ls | grep myfile | xargs bash

ou filtrar usandofind

find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;

informação relacionada