echoing basename sob xargs?

4

Eu tenho o seguinte comando:

ls /some/path/*dat | xargs -n 1 -I @ sh -c "echo 'basename @'"

com o diretório /some/path/ contendo:

/some/path/a
/some/path/b
/some/path/c
/some/path/d

Eu quero obter a saída:

a
b
c
d

Mas ainda estou recebendo caminhos completos. O que estou fazendo errado?

edit: BTW, eu sei que existe uma maneira mais fácil, posso apenas executar basname em vez de

echo 'basename @'

Mas eu preciso executar um comando complexo, algo como

octave --silent --eval "somefunction(''basename @'','@',...))"

edit2:

Aqui está o comando real:

 ls ~/phd/data/conll2012/dev.megam/*dat | xargs -P 16 -n 1 -I@ timeout -k 1s 15m sh -c "if [ ! -f '~/phd/xp/conll2012/dev.megam/@.$epsilon$mink$minn$alpha' ]; then octave --silent --eval \"xprp('~/phd/xp/conll2012/dev.megam/@.$epsilon$mink$minn$alpha.rp','@',$alpha,$mink,$minn,$epsilon);\" 2>> ~/xpgrid.log;fi"
Basicamente, eu tenho um conjunto de arquivos em um diretório e esse comando se alimenta desses arquivos para gerar resultados em outro diretório, verificando se o resultado ainda não existe.

Então, eu preciso dos dois arquivos com fullpath e arquivos com apenas o nome base.

Como fazer isso funcionar? O exemplo mais fácil no começo pode ajudar a tornar isso mais claro.

    
por davcha 04.11.2014 / 16:12

3 respostas

3

O testcase pode ser corrigido simplesmente alterando as aspas duplas para aspas simples, mas você pode gostar de saber sobre o GNU parallel .

Você pode fazer o mesmo assim:

parallel echo {/} ::: /some/path/*dat

(Você pode precisar citar as chaves em alguns shells.)

Além de ter uma sintaxe mais clara, parallel executará os vários comandos de uma só vez.

Seu segundo exemplo seria assim:

parallel octave --silent --eval "\"somefunction('{/}', '{}', ...)\"" ::: /some/path/*dat

(Você precisa ter aspas entre aspas porque é avaliado duas vezes.)

    
por 04.11.2014 / 16:34
1
ls /some/path/*dat | xargs -n 1 -I @ sh -c 'echo 'basename "@"''

O basename é executado muito cedo no seu código.

Se você não tiver certeza de que não há espaços ou guias nos caminhos, use -d \n (ou find ... -print0 | xargs -0 ... ) e lembre-se do " em torno de @ .

    
por 04.11.2014 / 16:16
0
 # find all my perl file names with *.pl or *.pm ext sorted 
 find src/ -name '*.pm' -o -name '*.pl'  \
  | xargs -n 1 -I @ sh -c 'echo 'basename "@"'' | sort
    
por 18.03.2018 / 12:33