Expandindo globs em xargs

6

Eu tenho um diretório como este

mkdir test
cd test
touch file{0,1}.txt otherfile{0,1}.txt stuff{0,1}.txt

Eu quero executar algum comando como ls em certos tipos de arquivos no diretório e ter o * (glob) expandido para todas as possibilidades do nome do arquivo.

echo 'file otherfile' | tr ' ' '\n' | xargs -I % ls %*.txt

Este comando não expande o glob e tenta procurar o literal 'file * .txt'

Como escrevo um comando semelhante que expande as globs? (Eu quero usar xargs para que o comando possa ser executado em paralelo)

    
por Craig 30.06.2011 / 01:29

3 respostas

8

Isso é antigo, mas me deparei com esse problema e encontrei outra maneira de corrigi-lo. Faça xargs executar o bash com -c e seu comando. Por exemplo:

echo 'file otherfile' | tr ' ' '\n' | xargs -I % bash -c "ls %*.txt"

Isso força a expansão glob.

    
por 27.11.2013 / 21:47
2

O que você está fazendo não funcionará porque o glob não é expandido pelo comando xargs quando é executado, ele é expandido pelo shell assim que você pressiona enter e antes que qualquer um desses comandos comece a ser executado. Então o glob tenta expandir é:

%*.txt

e como não há arquivos que correspondam a esse padrão, ele o deixa sozinho e, quando o xargs é executado, ele substitui seus argumentos nessa sequência.

A solução mais simples é provavelmente escrever um padrão que corresponda a todos os arquivos em que você está interessado de uma só vez:

ls {file,otherfile}*.txt
    
por 30.06.2011 / 01:55
0

Consegui obter a funcionalidade que queria usando o sinal -1 para ls . Aqui está como meu comando parece:

ls -1 {file,otherfile}*.txt | xargs -I% echo mycommand %
    
por 11.02.2014 / 16:17