Usando o Pipeline para direcionar arquivos para o programa que os abre

0

Eu tenho uma pasta Music , na qual eu tenho algumas faixas de música, que não são organizadas muito bem. Assim, se eu quiser encontrar uma faixa em particular, eu geralmente digito: ls Music | grep <keyword> , onde <keyword> é alguma palavra-chave que eu espero que o nome do arquivo tenha. Em seguida, minha linha de comando retornará o nome do arquivo para o qual estou procurando, <name> e, em seguida, para abrir o arquivo de música, digerei vlc <name> & .

Minha pergunta é se seria possível simplificar tudo isso em uma única operação? Eu tentei usar ls Music | grep <keyword> | vlc , mas isso não teve sucesso. Como eu faria isso?

(Mais geralmente, como eu usaria o pipeline para esse tipo de propósito?)

    
por Newb 11.11.2013 / 03:18

2 respostas

9

Você pode usar xargs para isso. Vai levar o que é canalizado em stdin e usá-lo como argumentos para um subcomando. Então, no seu caso, pode ser assim:

ls Music | grep <keyword> | xargs vlc &

Agora, esta sequência de comandos provavelmente ainda terá alguns problemas, principalmente espaço em branco. Por padrão, xargs dividirá sua entrada em qualquer whitepsace, portanto, se você tiver um arquivo chamado Artist Name - Track Name.mp3 , então xargs enviará 5 argumentos separados para vlc : Artist , Name , - , Track , Name.mp3 . Felizmente há uma maneira de contornar isso. Se você usar a opção -0 para xargs , ela usará nulo find para dividir sua entrada em argumentos para o subcomando. E, como acontece, o comando find suporta a gravação de correspondências de nomes de arquivos com um separador nulo (e ls | grep é uma ferramenta melhor para localizar arquivos do que %code% de qualquer maneira).

Então, isso pode ser um canal melhor:

find Music -iname '*<keyword>*' -print0 | xargs -0 vlc &
    
por 11.11.2013 / 04:26
3

Embora o uso de xargs seja muito útil, neste caso específico , seria melhor usar apenas glob.

vlc Music/*keyword* &  ## will find all filenames containing the string 'keyword'

Se você quiser recursividade (ou seja, procurando em subdiretórios), então você pode usar a opção de shell globstar:

shopt -s globstar
vlc Music/**/*keyword* &
    
por 11.11.2013 / 13:02