pasar variables de 'ls' a 'tar' a través de 'xargs'

9

Estoy tratando de hacer algo como

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

para archivar los 3 últimos archivos modificados, pero termina ejecutando el comando tar por separado para cada uno de los archivos y al final me queda un archivo tar que contiene el último de los 3 archivos (en el orden que sea). Sé que no estoy usando 'xargs' correctamente pero la búsqueda no ayudó; Encuentro ejemplos que tampoco funcionan. Incluso el comando más simple

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

termina con un archivo tar que contiene solo uno de los archivos en ese directorio.

oligilo
fuente

Respuestas:

8

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

Funciona para mi. ¿Hay alguna razón por la que necesita establecer la -Ibandera?

David King
fuente
Nunca se me ocurrió intentar eso; ¡Muchas gracias! Pero, ¿y si realmente quisiera pasarlos con -I? ¿Hay alguna forma de formatearlo correctamente de esa manera?
oligilo
Si desea usar la -Ibandera, debe usar algo diferente a {}la cadena de reemplazo. Por ejemplols -t | head -n 3 | xargs -I foo tar -cf t.tar foo
David King el
Lo hice, pero obtengo el mismo resultado: solo el último archivo o, de manera equivalente, ejecuta el comando tar por separado para cada elemento.
oligilo
Después de leer más en la página de manual de xargs ... -Iimplica -L 1que efectivamente significa ejecutar el siguiente comando para cada 1 línea de entrada, razón por la cual está viendo los resultados que es.
David King
Ah, ya veo; Muchas gracias por tu ayuda; me estaba molestando por días. Realmente lo aprecio.
oligilo
0

Según esta publicación , es mejor usar en rlugar de c, en caso de que xargscorte las entradas, produciendo un archivo tar que contenga solo el último fragmento. Entonces una mejor solución sería:

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