Создание архива tar без включения родительского каталога, когда файлы хранятся в разных каталогах.

11

У меня есть следующие четыре файла в файловой системе:

/home/martin/cvs/ops/cisco/b/s1
/home/martin/cvs/ops/cisco/b/s2
/home/martin/cvs/ops/extreme/b/r3
/home/martin/cvs/ops/j/b/r5

Мне нужно поместить эти файлы в архив tar, но я не хочу добавлять каталоги. Лучшее, что я мог придумать, было:

tar -C ~/cvs/ops/ -czvf archive.tgz cisco/b/s1 cisco/b/s2 extreme/b/r3 j/b/r5

Это все еще не идеально, потому что каждый файл в архиве имеет две директории. Есть ли способ лучше? Или я просто скопировать s1, s2, r3и r5файлы в один каталог и создать архив с tar -czvf archive.tgz s1 s2 r3 r5?

Мартин
источник

Ответы:

17

Вы можете использовать -Cнесколько раз (перемещение из одного каталога в другой):

tar czvf archive.tar.gz -C /home/martin/cvs/ops/cisco/b s1 s2 -C ../../extreme/b r3 -C ../../j/b r5

Обратите внимание, что каждый -Cпараметр интерпретируется относительно текущего каталога в этой точке (или вы можете просто использовать абсолютные пути).

Стивен Китт
источник
11

Если у вас есть список файлов в файле или вы можете сгенерировать их с помощью команды, вы можете использовать одну команду tar GNU:

tar cf foo.tar -T list-of-files --transform 's:.*/::'

Преобразование по-прежнему сохраняет каталоги, но полностью выравнивает макет. Таким образом, вам нужен какой-то способ фильтрации каталогов, следовательно, необходим список файлов.

Мур
источник
8

Вы можете добавлять файлы в архив один за другим:

tar cf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s1
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s2
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/extreme/b r3
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/j/b r5

Вы можете написать это, чтобы упростить: для каждого пути запустите tar rfбазовый каталог в качестве значения -Cпараметра и базовое имя файла без пути для добавления.

Янош
источник