Tar: добавьте все файлы и каталоги в текущий каталог. ВКЛЮЧАЯ .svn и т.д. - программирование
Подтвердить что ты не робот

Tar: добавьте все файлы и каталоги в текущий каталог. ВКЛЮЧАЯ .svn и т.д.

Я пытаюсь использовать tar.gz в каталоге и использовать

tar -czf workspace.tar.gz *

В результате tar включает в себя .svn каталоги в поддирерах, но NOT в текущем каталоге (поскольку * распространяется только на "видимые" файлы, прежде чем он будет передан tar

Я попытался

tar -czf workspace.tar.gz ., но затем я получаю сообщение об ошибке, потому что '.' во время чтения:

tar: ./workspace.tar.gz: file changed as we read it

Есть ли трюк, чтобы * соответствовал всем файлам (включая префикс с префиксом dot) в каталоге?

(используя bash в Linux SLES-11 (2.6.27.19)

4b9b3361

Ответ 1

Если вы действительно не хотите включать верхний каталог в tarball (и это вообще плохая идея):

tar czf workspace.tar.gz -C /path/to/workspace .

Ответ 2

Не создавайте файл tar в каталоге, который вы собираете:

tar -czf /tmp/workspace.tar.gz .

делает трюк, за исключением того, что он будет извлекать файлы по всему текущему каталогу при распаковке. Лучше сделать:

cd ..
tar -czf workspace.tar.gz workspace

или, если вы не знаете имя каталога, в котором вы были:

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(Предполагается, что вы не следовали символическим ссылкам, чтобы добраться до того места, где вы находитесь, и что оболочка не пытается угадать вас, перепрыгивая назад через символическую ссылку - bash не заслуживает доверия в этом отношении. вам нужно беспокоиться об этом, используйте cd -P .. для создания каталога физических изменений. Глупо, что это не поведение по умолчанию на моем представлении - путаное, по крайней мере, для тех, для кого cd .. никогда не было альтернативного значения.)


В одном из комментариев в дискуссии говорится:

Мне [...] нужно исключить верхний каталог, а мне [...] нужно поместить tar в базовый каталог.

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

Вторая часть комментария может быть рассмотрена одним из двух способов:

  • Либо: создайте файл где-нибудь еще - /tmp - одно из возможных мест - и затем верните его в исходное местоположение после его завершения.
  • Или: если вы используете GNU Tar, используйте параметр --exclude=workspace.tar.gz. Строка после = является шаблоном - примером является простейший шаблон - точное совпадение. Возможно, вам нужно указать --exclude=./workspace.tar.gz, если вы работаете в текущем каталоге вопреки рекомендациям; вам может потребоваться указать --exclude=workspace/workspace.tar.gz, если вы работаете на одном уровне, как предлагается. Если у вас есть несколько tar файлов для исключения, используйте '*', как в --exclude=./*.gz.

Ответ 3

в каталоге хотите сжать (текущий каталог) попробуйте это:

tar -czf workspace.tar.gz . --exclude=./*.gz

Ответ 4

Вы можете исправить форму ., используя --exclude:

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

Ответ 5

Вы можете включать скрытые каталоги, возвращая каталог и делая:

cd ..
tar -czf workspace.tar.gz workspace

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

Ответ 6

Есть несколько шагов:

  • Замените * на ., чтобы включить скрытые файлы.
  • Чтобы создать архив в том же каталоге, можно использовать --exclude=workspace.tar.gz для исключения самого архива.
  • Чтобы предотвратить ошибку tar: .: file changed as we read it, когда архив еще не создан, убедитесь, что он существует (например, с помощью touch), поэтому -exclude соответствует имени файла архива. (Это не соответствует файлу, который не существует)

В сочетании это приводит к следующему script:

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

Ответ 7

На самом деле проблема связана с параметрами сжатия. Фокус в том, что труба результирует к компрессору вместо использования встроенных опций. Кстати, это также может улучшить сжатие, поскольку вы можете установить дополнительные параметры сжатия.

Минимальная смола:

tar --exclude=*.tar* -cf workspace.tar .

Труба к компрессору по вашему выбору. Этот пример является подробным и использует xz с максимальным сжатием:

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

Решение было протестировано на Ubuntu 14.04 и Cygwin в Windows 7. Это ответ сообщества wiki, поэтому не стесняйтесь редактировать, если вы заметили ошибку.

Ответ 8

Обновление: Я добавил исправление для комментария OP.

tar -czf workspace.tar.gz .

действительно изменит текущий каталог, но почему бы не разместить файл где-нибудь еще?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update

Ответ 9

Хороший вопрос. В ZSH вы можете использовать модификатор globing (D), который обозначает "dotfiles". Для сравнения:

ls $HOME/*

и

ls $HOME/*(D)

Это правильно исключает специальные записи в каталоге . и ... В Bash вы можете использовать .*, чтобы включить dotfiles в явном виде:

ls $HOME/* $HOME/.*

Но это включает . и .., так что это не то, что вы искали. Я уверен, что есть способ сделать * match dotfiles в bash тоже.

Ответ 10

tar -czf workspace.tar.gz .??* *

Задание .??* будет включать в себя "точечные" файлы и каталоги, у которых есть не менее двух символов после точки. Нижняя сторона - это не будет включать файлы/каталоги с одним символом после точки, например .a, если они есть.

Ответ 11

Если пространство на диске не является проблемой, это также может быть очень просто:

mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup

Ответ 12

Проблема с большинством решений, представленных здесь, заключается в том, что tar содержит ./ при попрошайничестве каждой записи. Таким образом, это приводит к наличию каталога . при открытии его через компрессор графического интерфейса. Итак, что я в итоге сделал:

ls -1A | xargs -d "\n" tar cfz my.tar.gz

Если у вас уже есть my.tar.gz в текущем каталоге, вы можете захотеть это сделать:

ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

Помните, что xargs имеет определенный предел (см. xargs --show-limits). Таким образом, это решение не сработает, если вы пытаетесь создать пакет с большим количеством записей (каталогов и файлов) в каталоге, который вы пытаетесь использовать tar.

Ответ 13

Еще одно решение, предполагающее, что количество элементов в папке не огромно:

tar -czf workspace.tar.gz `ls -A`

(ls -A печатает нормальные и скрытые файлы, но не "." и "..", как это делает ls -A.)

Ответ 14

Использование find, вероятно, самый простой способ:

find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+

find . -maxdepth 1 найдет все файлы/каталоги/символические ссылки /etc в текущем каталоге и запустит команду, указанную в -exec. {} в списке файлов команд означает, что здесь и \+ означает, что команда будет выполняться как:

tar zcvf workspace.tar.gz .file1 .file2 .dir3

вместо

tar zcvf workspace.tar.gz .file1
tar zcvf workspace.tar.gz .file2
tar zcvf workspace.tar.gz .dir3