2011-02-04 12 views
10

benim tree komut döner Nasıl düz katran arşivi

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

oluşturmak için nasıl aşağıdaki yapı ile tmp dizininde arşiv ps.tar.gz oluşturabilirsiniz:

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

?

+0

mkdir arşivi; t/-name * .ps -exec ln {} arşivini bul \ \; ; (cd arşivi && tar zcf ../ps.tar.gz * .ps); rm -rf arşivi – sastanin

cevap

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

"cd" ye gerek yok, tar's -C kullanın! – chris

+0

iyi nokta chris, bunu kullanmak için güncellendi! – cowsandmilk

+1

Yukarıdakileri bir oneliner'da yapmak isterseniz: bulun. -type f -exec bash -c "arşiv =./ps.tar.gz; fname = \' basename {} \ '; fdir = \' dirname {} \ '; tar cfz \ $ arşivi -C \ $ fdir \ $ fname "\; – Qben

11

GNU tar Eğer --xform argüman kullanabilirsiniz. Bir sed ifadesi alır ve her dosya adına uygular. Bu nedenle, son /'a kadar olan tüm karakterleri kaldırmak için aşağıdakileri kullanabilirsiniz:

+0

http://serverfault.com/a/566345/343194 ile birlikte birden çok dizin için daha iyi sonuç elde edilebilir. Bulmak gibi bir şey./commondir -type f | tar --transform '/.*\/// g' -cvzf ./file.tar.gz --files-from =/dev/stdin '. Bu şekilde boş çocuk dizinleri hariç tutulacak. –