
Solaris 11
Quiero encontrar todos los archivos de más de 31 días, tarlos y comprimir el archivo tar.
Me gustaría hacer esto en una línea. ¡¡¡Prefiero usar pbzip2 que gzip !!!
Esto es lo que probé como prototipo:
find /tmp -mtime +31 -type f -name "arch*" -exec sh -c 'tar -czvPfE /tmp/old_files_$(date +%F).tar.gz $0' {} \;
El problema con esto es que crea un tar.gz para cada archivo sobrescribiendo el archivo anterior (quiero todos los archivos en una sola bola tar). La "r" no funciona a menos que exista el alquitrán. Y la "z" llama a gzip, no a pbzip2.
ACTUALIZAR:
@DopeGhoti Thank you. First, my bad for not checking the man page for the "j" option. However, this almost worked. root@myhost:/tmp# find /tmp -mtime +31 -type f -name "arch*"| wc -l =207 root@myhost:/tmp# find /tmp -mtime +31 -type f -name "arch*"| xargs tar -cjf /tmp/old_files_$(date +%F).tbz root@myhost:/tmp# l|tail -rw------- 1 root root 1.6K Nov 30 15:59 old_files_2017-11-30.tbz root@myhost:/tmp# bunzip2 old_files_2017-11-30.tbz root@myhost:/tmp# tar tf old_files_2017-11-30.tar|wc -l =15
Respuesta1
Suponiendo que los nombres de los archivos no contienen caracteres de nueva línea, POSIXly (excepto obviamente pbzip2
), que toma la lista de archivos para archivar en stdin de forma predeterminada (y también escribe el archivo en stdout de forma predeterminada)
find /tmp -mtime +31 -type f -name "arch*" | pax -w | pbzip2 > file.tar.bz2
O usar Solaris tar
para poder conservar sus opciones P
/ :E
find /tmp -mtime +31 -type f -name "arch*" |
tar cvPEf - -I /dev/stdin | pbzip2 > file.tar.bz2
-I /dev/stdin
para tomar la lista de archivos de stdin, f -
para generar el archivo en stdout, que luego se comprime pbzip2
como con pax
.