Как создать плоский tar-архив

моя команда tree возвращает

tmp
`-- t
    `-- e
        |-- foo.ps
        `-- s
            |-- bar.ps
            `-- t
                `-- baz.ps

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

tmp
|-- ps.tar.gz
|   |-- foo.ps
|   |-- bar.ps
|   `-- baz.ps
`-- t
    `-- e
        |-- foo.ps
        `-- s
            |-- bar.ps
            `-- t
                `-- baz.ps

?


person noisy    schedule 04.02.2011    source источник
comment
архив mkdir ; find t/ -name *.ps -exec ln {} архив/ \; ; ( cd архив && tar zcf ../ps.tar.gz *.ps ) ; рм -рф архив   -  person sastanin    schedule 04.02.2011


Ответы (2)


для GNU tar вы можете использовать аргумент --xform. Он принимает выражение sed и применяет его к каждому имени файла. Итак, для удаления всех символов до последнего / вы можете использовать:

tar -c --xform s:^.*/:: your-files
person Panda    schedule 10.08.2011
comment
Лучшего результата для нескольких каталогов можно добиться в сочетании с serverfault.com/a/566345/343194. Что-то вроде find ./commondir -type f | tar --transform 's/.*\///g' -cvzf ./file.tar.gz --files-from=/dev/stdin. Таким образом, пустые дочерние каталоги будут исключены. - person nikolay_turpitko; 24.11.2016

person    schedule
comment
Если вам нравится делать вышеперечисленное в однострочнике: найдите . -type f -exec bash -c archive=./ps.tar.gz;fname=`basename {}`;fdir=`dirname {}`;tar cfz \$archive -C \$fdir \$fname \; - person Qben; 13.11.2012
comment
@Qben это должно быть tar rf для добавления в архив. a) Использование tar cf перезапишет выходной файл несколькими последними файлами. b) Не удается добавить в заархивированном режиме. Поэтому нужно сделать gzip для выходного файла tar. - person GuruM; 30.07.2013
comment
+1 за аккуратный сценарий. Не заметил, что часть $(basename $file) используется вместе с параметром -C, чтобы помочь сгладить файл tar. - person GuruM; 30.07.2013
comment
В приведенном выше сценарии есть проблема с пробелами в имени файла/каталога. Нужно избегать пространств. - person GuruM; 30.07.2013
comment
Использование fname=${file##*/} и fdir=${file%/*} уменьшает потребность в растушевке. - person GuruM; 30.07.2013