
索拉里斯 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 球中)。除非 tar 存在,否則「r」不起作用。並且“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
.