passando variáveis ​​de 'ls' para 'tar' via 'xargs'

9

Estou tentando fazer algo como

ls -t | head -n 3 | xargs -I {} tar -cf t.tar {}

para arquivar os 3 últimos arquivos modificados, mas ele acaba executando o comando tar separadamente para cada um dos arquivos e, no final, fiquei com um arquivo tar contendo o último dos 3 arquivos (em qualquer ordem). Sei que não estou usando o 'xargs' corretamente, mas a pesquisa não ajudou; Encontro exemplos que também não funcionam. Mesmo o comando mais simples

ls | xargs -I {} tar -cf t.tar {}

termina com um arquivo tar que contém apenas um dos arquivos nesse diretório.

oligilo
fonte

Respostas:

8

ls -t | head -n 3 | xargs tar -cf t.tar

Funciona para mim. Existe um motivo para você precisar -Idefinir o sinalizador?

David King
fonte
Nunca me ocorreu tentar isso; muito obrigado! Mas e se eu realmente quisesse passar com -I? Existe uma maneira de formatá-lo corretamente dessa maneira?
Oligilo
Se você deseja usar o -Isinalizador, deve usar algo diferente {}da substituição. Por exemplols -t | head -n 3 | xargs -I foo tar -cf t.tar foo
David King
Consegui, mas estou obtendo o mesmo resultado: apenas o último arquivo ou, equivalentemente, executa o comando tar separadamente para cada item.
Oligilo
Depois de ler mais na página de manual do xargs ... -Iimplica o -L 1que significa efetivamente executar o seguinte comando para cada 1 linha de entrada, e é por isso que você está vendo os resultados que está.
David King
Ah entendo; muito obrigado por sua ajuda; estava me incomodando por dias. Eu realmente gostei disso.
Oligilo
0

De acordo com este post , é melhor usá-lo em rvez de c, no caso de xargsagrupar as entradas, produzindo um arquivo tar contendo apenas o último pedaço. Portanto, uma solução melhor seria:

rm -f t.tar 2>/dev/null  # remove tar if there
ls -t | head -n 3 | xargs tar -rf t.tar
Julian
fonte