
Солярис 11
Я хочу найти все файлы старше 31 дня, заархивировать их и сжать tar-файл.
Я бы хотел сделать это в одну строку. Я бы лучше использовал pbzip2, чем gzip!!!
Вот что я попробовал в качестве прототипа:
find /tmp -mtime +31 -type f -name "arch*" -exec sh -c 'tar -czvPfE /tmp/old_files_$(date +%F).tar.gz $0' {} \;
Проблема в том, что он создает tar.gz для каждого файла, перезаписывая файл до него (я хочу, чтобы все файлы были в одном tar-шаре). "r" не работает, если tar не существует. А "z" вызывает gzip, а не pbzip2
ОБНОВЛЯТЬ:
@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
решение1
Предполагая, что имена файлов не содержат символов новой строки, POSIXly (за исключением pbzip2
очевидных случаев), который по умолчанию принимает список файлов для архивации на stdin (а также записывает архив на stdout)
find /tmp -mtime +31 -type f -name "arch*" | pax -w | pbzip2 > file.tar.bz2
Или использовать Solaris tar
, чтобы сохранить свои параметры P
/ :E
find /tmp -mtime +31 -type f -name "arch*" |
tar cvPEf - -I /dev/stdin | pbzip2 > file.tar.bz2
-I /dev/stdin
взять список файлов из stdin, f -
вывести архив на stdout, который затем сжимается pbzip2
аналогично с помощью pax
.