Я пытаюсь создать каталог tar.gz и использовать
tar -czf workspace.tar.gz *
Полученный tar включает .svn
каталоги в подкаталогах, но НЕ в текущем каталоге (поскольку он *
расширяется только до `` видимых '' файлов, прежде чем он будет передан в tar
Я попытался
tar -czf workspace.tar.gz .
вместо этого, но тогда я получаю сообщение об ошибке, потому что "." изменилось при чтении:
tar: ./workspace.tar.gz: file changed as we read it
Есть ли уловка, позволяющая *
сопоставить все файлы (в том числе с префиксом точки) в каталоге?
(с использованием bash в Linux SLES-11 (2.6.27.19)
linux
bash
design-patterns
tar
Миха
источник
источник
Ответы:
Не создавайте tar-файл в каталоге, который вы собираете:
делает свое дело, за исключением того, что при распаковке файлы распаковываются по всему текущему каталогу. Лучше сделать:
cd .. tar -czf workspace.tar.gz workspace
или, если вы не знаете имя каталога, в котором находились:
base=$(basename $PWD) cd .. tar -czf $base.tar.gz $base
(Это предполагает, что вы не следовали символическим ссылкам, чтобы добраться туда, где находитесь, и что оболочка не пытается угадать вас, перескакивая назад по символической ссылке -
bash
в этом отношении не стоит доверять. Если вам нужно беспокоиться об этом, использоватьcd -P ..
для физического изменения каталога. Глупо, что это не поведение по умолчанию, на мой взгляд - сбивает с толку, по крайней мере, для тех, для когоcd ..
никогда не было альтернативного значения.)Один комментарий в обсуждении гласит:
Первая часть комментария не имеет особого смысла - если файл tar содержит текущий каталог, он не будет создан при извлечении файла из этого архива, потому что, по определению, текущий каталог уже существует (за исключением очень странных обстоятельств ).
Со второй частью комментария можно справиться одним из двух способов:
/tmp
это одно из возможных мест - а затем переместите его обратно в исходное место после его завершения.--exclude=workspace.tar.gz
опцией. Строка после символа=
- это образец - это самый простой образец - точное совпадение. Возможно, вам потребуется указать, работаете--exclude=./workspace.tar.gz
ли вы в текущем каталоге вопреки рекомендациям; вам может потребоваться указать, работаете--exclude=workspace/workspace.tar.gz
ли вы на один уровень выше, как предлагается. Если вам нужно исключить несколько файлов tar, используйте '*
', как в--exclude=./*.gz
.источник
Если вы действительно не хотите включать верхний каталог в архив (а это вообще плохая идея):
источник
Acdrtux
, либо одно из длинных имен функций. Функциональная буква не требует префикса-
, и ее можно комбинировать с другими однобуквенными параметрами.Нужно сделать несколько шагов:
*
на,.
чтобы также включить скрытые файлы.--exclude=workspace.tar.gz
можно использовать a , чтобы исключить сам архив.tar: .: file changed as we read it
ошибку, когда архив еще не создан, убедитесь, что он существует (например, с помощьюtouch
), чтобы параметр --exclude соответствовал имени файла архива. (Не совпадает, файл не существует)В совокупности это приводит к следующему сценарию:
источник
--verbose
, например , так:-czvf
.в каталоге, который хотите сжать (текущий каталог), попробуйте следующее:
источник
.gz
файлы в каталоге.Вы можете включить скрытые каталоги, вернувшись в каталог и выполнив:
cd .. tar czf workspace.tar.gz workspace
Предполагая, что каталог, который вы хотите сжать, назывался рабочей областью.
источник
tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
-
перед тем,czf
как заставить работать. В противном случае я получалCannot stat: No such file or directory
сообщение об ошибке.Вы можете исправить
.
форму, используя--exclude
:источник
Обновление: я добавил исправление для комментария OP.
действительно изменит текущий каталог, но почему бы не поместить файл в другое место?
tar -czf somewhereelse/workspace.tar.gz . mv somewhereelse/workspace.tar.gz . # Update
источник
Собственно проблема в параметрах сжатия. Хитрость заключается в том, чтобы передать результат дегтя в компрессор вместо использования встроенных опций. Кстати, это также может дать вам лучшее сжатие, поскольку вы можете установить дополнительные параметры сжатия.
Минимальная смола:
Подключите к компрессору по вашему выбору. Этот пример подробный и использует xz с максимальным сжатием:
Решение было протестировано на Ubuntu 14.04 и Cygwin на Windows 7. Это ответ сообщества вики, поэтому не стесняйтесь редактировать, если обнаружите ошибку.
источник
Проблема большинства представленных здесь решений заключается в том, что 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.источник
Хороший вопрос. В ZSH вы можете использовать модификатор подстановки
(D)
, что означает «точечные файлы». Сравните:ls $HOME/*
а также
ls $HOME/*(D)
Это правильно исключает специальные записи каталога
.
и..
. В Bash вы можете использовать.*
для явного включения точечных файлов:ls $HOME/* $HOME/.*
Но это включает в себя
.
и..
, так что это не то, что вы искали. Я уверен, что есть способ сделать*
точечные файлы соответствия и в bash.источник
.??*
для соответствия всем файлам точек,.
а не и..
. Это не дает файлов с односимвольными точками (например,.a
). Чтобы получить и их, используйте более сложный.[^.]*
.Еще одно решение, предполагающее, что количество элементов в папке невелико:
(
ls -A
печатает обычные и скрытые файлы, но не «.» и «..», как этоls -a
происходит.)источник
При указании
.??*
будут включены файлы с точками и каталоги, в которых после точки будет не менее 2 символов. Обратной стороной является то, что он не будет включать файлы / каталоги с одним символом после точки, например.a
, если они есть.источник
Если место на диске не проблема, это тоже может быть очень легко сделать:
источник
У меня была похожая ситуация. Я думаю, что лучше всего создать tar в другом месте, а затем использовать -C, чтобы указать tar базовый каталог для сжатых файлов. Пример:
Таким образом, нет необходимости исключать собственный tar-файл. Как отмечено в других комментариях, -A выведет список скрытых файлов.
источник
10 лет спустя у вас есть альтернатива
tar
, проиллюстрированная Git 2.30 (Q1 2021), которая использует "git archive
" ( man ) для создания tar-архива выпуска вместо tar.(Вам не нужен Git 2.30 для применения этой альтернативы)
См. Commit 4813277 (11 октября 2020 г.) и commit 93e7031 (10 октября 2020 г.) Рене Шарфе (
rscharfe
) .(Объединено Junio C Hamano -
gitster
- в коммите 63e5273 , 27 октября 2020 г.)Так что вместо:
Вы можете использовать только Git:
Первоначально это было предложено, потому что, как объясняется здесь , на какой-то экзотической платформе может быть старый дистрибутив tar с отсутствующими опциями.
источник
Пожалуй,
find
самый простой способ использовать:find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+
find . -maxdepth 1
найдет все файлы / каталоги / символические ссылки / и т.д. в текущем каталоге и выполнит команду, указанную в-exec
. Значок{}
в команде означает, что список файлов идет сюда и\+
означает, что команда будет запускаться как:вместо того
источник