2011-02-04 11 views
10

treeコマンドが返す はどのように平らなtarアーカイブに

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

を作成する方法私は次のような構造でtmpディレクトリにアーカイブps.tar.gzを作成することができます

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

+0

mkdir archive; find t/-name * .ps -exec ln {}アーカイブ/ \; ; (cd archive && tar zcf ../ps.tar.gz * .ps); rm -rf archive – sastanin

答えて

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"する必要はなく、tarの-Cを使用してください! – chris

+0

良い点クリス、それを更新しました! – cowsandmilk

+1

あなたがonelinerで上記をしたいのなら:find。 fdir = \ 'dirname {} \'; tar cfz \ $アーカイブ-C \ $ fdir \ fdir \ $ fname "\; – Qben

11

GNU tarの場合は、--xform引数を使用できます。これはsedという表現を取り、それを各ファイル名に適用します。すべての文字を最後の/まで削除するには、次のようにします。

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

http://serverfault.com/a/566345/343194と組み合わせて、複数のディレクトリでより良い結果を得ることができます。 'のようなものfind ./commondir -type f | tar --transform 's /.*\/// g' -cvzf ./file.tar.gz --files-from =/dev/stdin'を実行します。この方法では、空の子ディレクトリは除外されます。 –

関連する問題