usando xargs passa argumentos para sub shell com pipe

0

Eu quero renomear um número de arquivos. Eu acho que posso usar xargs para fazer isso.

find ./ -name "upload.log-*" 
./upload.log-20180622.gz-20180624.gz-20180626.gz
./upload.log-20180624.gz-20180626.gz
./upload.log-20180620.gz-20180622.gz-20180624.gz-20180626.gz
./upload.log-20180621.gz-20180623.gz-20180625.gz-20180627.gz

find ./ -name "upload.log-*" -print | cut -d"-" -f-2
./upload.log-20180622.gz
./upload.log-20180624.gz
./upload.log-20180620.gz
./upload.log-20180621.gz

Estou tentando o seguinte, mas não parece estar funcionando

find ./ -name "upload.log-*" | xargs -I '{}' sh -c "echo $1 $(echo $1 | cut -d"-" -f-2)" "{}"
    
por nelaaro 27.06.2018 / 09:38

1 resposta

0

Isso faz o que eu preciso fazer

find ./ -name "cleanup.log-*" | xargs -I '{}' sh -c 'mv "$1" $(echo {} | cut -d"-" -f-2)' - {}

O bit complicado foi converter a string -I {} da substituição xargs em argumentos para o comando xargs sh -c ... .
Eu fiz isso colocando um argumento de opção no - , no final do comando antes da string de substituição {} .

Assim, meu comando para xargs é o seguinte.
sh -c 'mv "$1" $(echo {} | cut -d"-" -f-2)' - {}

Eu usei isso para testar o que eu queria antes de executar o comando Mover

find ./ -name "upload.log-*" | xargs -I '{}' sh -c 'echo "$1" $(echo {} | cut -d"-" -f-2)' - {}

Achei este site útil para entender como resolver esse problema

link

    
por 27.06.2018 / 09:38