2011-02-04 7 views
10

tree lệnh lợi nhuận của tôiLàm thế nào để tạo phẳng archive tar

tmp 
`-- t 
    `-- e 
     |-- 23.ps 
     `-- s 
      |-- adsf.ps 
      `-- t 
       `-- dupa.ps 

Làm thế nào tôi có thể tạo ps.tar.gz lưu trữ trong thư mục tmp với cấu trúc sau:

tmp 
|-- ps.tar.gz 
| |-- 23.ps 
| |-- adsf.ps 
| `-- dupa.ps 
`-- t 
    `-- e 
     |-- 23.ps 
     `-- s 
      |-- adsf.ps 
      `-- t 
       `-- dupa.ps 

?

+0

lưu trữ mkdir; tìm t/-name * .ps -exec ln {} lưu trữ/\; ; (lưu trữ cd && tar zcf ../ps.tar.gz * .ps); rm -rf lưu trữ – sastanin

Trả lời

4
outfile=$(pwd)/ps.tar;find . -type f | while read file; do 
    tar rf $outfile -C $(dirname $file) $(basename $file) 
done 
gzip $outfile 
+1

không cần phải "cd", sử dụng tar -C! – chris

+0

điểm tốt chris, cập nhật để sử dụng nó! – cowsandmilk

+1

Nếu bạn muốn thực hiện điều này ở trên trên trình duyệt: hãy tìm. -type f -exec bash -c "lưu trữ =./ps.tar.gz; fname = \' tên tệp {} \ '; fdir = \' dirname {} \ '; tar cfz \ $ lưu trữ -C \ $ fdir \ $ fname "\; – Qben

11

cho GNU tar bạn có thể sử dụng đối số --xform. Nó có một biểu thức sed và áp dụng nó trên mỗi tên tệp. Vì vậy, để xóa tất cả các ký tự tối đa / mới nhất, bạn có thể sử dụng:

tar -c --xform s:^.*/:: your-files 
+0

Kết quả tốt hơn cho nhiều thư mục có thể đạt được kết hợp với http://serverfault.com/a/566345/343194. Một cái gì đó như 'tìm ./commondir-type f | tar --transform 's /.*\/// g' -cvzf ./file.tar.gz --files-from =/dev/stdin'. Bằng cách này, thư mục con trống sẽ bị loại trừ. –