2013-08-01 1 views
3

Как я могу упаковать в tar-файл только последний каталог из пути? Например, у меня есть несколько путейКак я могу упаковать в tar-файл только последний каталог из пути?

/usr/local/files/dir1/ 

    file1.txt 
    file2.txt 
    file3.txt 

/usr/local/files/dir2/ 

    file3.txt 
    file4.txt 
    file5.txt 

если я запускаю команду:

tar czf my_arch.tar.gz -C /usr/local/files/dir1 . 

я получить только сдерживание dir1 каталога, без себя.

Так что я - my_arch.tar.gz/file1.txt, file2.txt, file3.txt, Но мне нужна структура, как, что в моем архиве -

my_arch.tar.gz/dir1/file1.txt, file2.txt, file3.txt 

Как я могу это сделать?

спасибо.

ответ

0

Если я понимаю, что вы спрашиваете правильно, вы хотите, чтобы ваш tar-файл содержал каталог.

Попробуйте без -C флага, как в:

tar -czf my_arch.tar.gz /usr/local/files/dir1 
+0

Я забыл - мне не нужно сохранять структуру пути. За исключением последней папки. – tenzor

+0

Можете ли вы более подробно объяснить бит «последней папки»? Вы хотите, чтобы вы только захотели архивировать содержимое последней папки, указанной в ls? –

+0

@AlPacifico Я думаю, что он означает, что dir1 является последним каталогом, тогда tar должен содержать dir1/file1, file2..etc. Когда он распадается, он должен извлечь каталог dir1 и все файлы внутри. Я ищу то же самое, но не смог найти. – kiranking

1

попробовать

cd /usr/local/files 
tar -cvzf my_arch.tar.gz dir1 

Параметр -C директива заставит вас изменить в dir1 и, таким образом, не архивировать папку, но ее содержание:

-C, --directory DIR 
    change to directory DIR 
+0

Нельзя использовать команду cd во время выполнения больших скриптов. – tenzor

+1

Вы не указали, что запускаете скрипт. Почему это «небезопасно»? Флаг «-C» также вызывает изменение tar в каталог. Если вы беспокоитесь о несуществующих каталогах, вы можете добавить обработку ошибок 'cd/usr/local/files/dir1 || {dostuff; } ' – omnibear

+1

Кроме того, если вы беспокоитесь об изменении каталогов в основном потоке вашей оболочки, вы можете использовать суб-оболочку, добавив круглые скобки: ' ( cd/usr/local/files tar -cvzf my_arch.tar. gz dir1 ) '. – omnibear

1

вы не можете сделать это непосредственно через tar. вот мое предложение:

#!/bin/bash 
mydir=/my_dir/whit/long_and/complicated_path/the_stuff_is_here 
dirname=$(dirname $mydir) 
basename=$(basename $mydir) 

tar cvf /tmp/$basename.tar -C $dirname $basename