tar-файлы из другого каталога без их копирования

10

Это должно быть очень просто для экспертов здесь.

У меня есть учетная запись Linux с пользовательской дисковой квотой всего 6 ГБ. Существует некоторая папка /optс данными объемом около 3 ГБ, с которыми при сжатии получается 1 ГБ. Есть несколько символических ссылок внутри data-folder. Обычно для создания рабочей резервной копии я делал следующее.

cp -rvfL /opt/data-folder ~/
cd ~/
tar -zcvf data-folder.tar.gz data-folder
rm -rvf data-folder

Теперь я уже израсходовал 2,5 ГБ в моей пользовательской квоте диска, у меня достаточно места для копирования файлов в мой дом, но не в tarнего снова.

Есть ли способ tar и скопировать папку с помощью одной команды, скажем, с помощью канала.

PS Я не могу войти, /optпотому что у меня есть доступ только для чтения /opt.

Kamath
источник
Вы, конечно, можете использовать tar в / opt, вы не можете писать там, вот и все. Флаг 'f' для tar (3) говорит о необходимости поместить результат в этот файл, который вполне может быть где-то еще. Т.е., cd /opt; tar zcf $HOME/junk.tar.gz junk.
vonbrand

Ответы:

5

Вы хотите создать tar-файл вне того места, где находятся файлы, которые вам нужны для tar?

Есть много способов сделать это.

Если он должен быть создан локально (= на той же машине):

tar czvf /path/to/destination/newfile.tar.gz  ./SOURCEDIR_OR_FILES

Вы можете добавить дополнительные файлы или каталоги в tar в конце этой команды.

Если он должен быть создан удаленно (т.е. вы хотите создать tar-файл на удаленном хосте из того, который содержит данные для тарирования):

tar czvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cat > newfile.tar.gz'

Более поздняя версия очень универсальна. Например, вы также можете «продублировать» каталог + подкаталоги, используя ту же технику:

Дублируйте каталог + подкаталоги в другой локальный каталог:

tar cf - ./SOURCEDIR_OR_FILES | ( cd LOCAL_DEST_DIR && tar xvf - )

Дублируйте каталог + подкаталоги в другой удаленный каталог:

tar cvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cd REMOTE_DEST_DIR && tar xf - '

Удалите символ 'v', если он не нужен для отображения файлов в том виде, в котором они были записаны (или не подвергнуты обработке): тогда он будет работать намного быстрее, но ничего не скажет, если не будет ошибки.

Я использую «. / ...» для источника, чтобы заставить tar сохранить его как ОТНОСИТЕЛЬНЫЙ путь. В некоторых случаях вы захотите добавить дополнительную информацию о пути:

Например, для tar-файла crontab, в том числе в / etc, вы можете сделать:

cd / ; tar czf all_crons.tgz  ./etc/*cron*  ./var/spool/cron

Я специально использую относительный путь: некоторые OLD-версии tar могут быть опасными и извлекать файлы с их исходным GLOBAL-путем, то есть вы можете это сделать: cd /safedir ; tar xvf sometarи файлы с глобальными именами перезаписывают файлы по своему первоначальному пути, то есть OUTSIDE of / safedir а не под ним! Очень опасно, и все еще возможно, поскольку существуют старые производственные серверы. Лучше всегда использовать относительные пути, даже если вы используете более позднюю версию tar.

Оливье Дюлак
источник
другой не касается различий между тарами: на некоторых вам, возможно, придется использовать -cvfвместо cvf, другие не узнают -стиль. И zраньше означало «сжимать с помощью« compress »», но в «недавнем» tar это означает «сжимать с помощью gzip». Вы можете знать , какая используется сжатие на файл с: file zefile. А затем переименуйте его соответствующим образом (если вы используете tar compress, его лучше переименовать .tar.Z, а не .tar.gz)
Оливье Дюлак
0

Используйте -hопцию tar. Со страницы руководства:

-h, --dereference
don't archive symlinks; archive the files they point to

так что вы можете использовать tar -zcvfh data-folder.tar.gz /opt/data-folder

harish.venkat
источник
О, я должен был упомянуть об этом, я уже попробовал tar -zcvfh ~ / data-folder.tar.gz / opt / data-folder. Я попал в какую-то проблему кругового архива. Я продолжаю копировать некоторые файлы и никогда не заканчивается.
Камат
Похоже, в подпапке данных есть круговая символическая ссылка.
Камат
2
@AUZKamath, это ошибка в GNU tar. Вы можете попробовать bsdtarвместо этого, или pax( cd /opt && pax -Lw data-folder | gzip > ~/data-folder.tar.gz), который обнаружит петли
Стефан Шазелас
1
@AUZKamath Вы можете одновременно tar и удалить файлы из вашего домашнего каталога, tar -rf <tarfilename> <filename>чтобы добавить в существующий файл tar.
harish.venkat
1
@ Стефан Chazelas, это работает, вы должны поставить его в качестве ответа.
Камат