2011-02-04 2 views
10

мои tree команда возвращаетКак создать плоский Архивировать TAR

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

Как я могу создать архив ps.tar.gz в директории TMP со следующей структурой:

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

?

+0

mkdir archive; найти t/-name * .ps -exec ln {} archive/\; ; (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. -type f -exec bash -c "archive =./ps.tar.gz; fname = \' basename {} \ '; fdir = \' dirname {} \ '; tar cfz \ $ archive -C \ $ 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/.*\/// g '-cvzf ./file.tar.gz --files-from =/dev/stdin'. Таким образом, пустые дочерние каталоги будут исключены. –

Смежные вопросы