2010-09-06 2 views
48

я стараюсь TAR.GZ каталог и использоватьдегтя: добавить все файлы и директории в текущей директории ЧИСЛЕ .svn и так далее

tar -czf workspace.tar.gz * 

В результате смола включает .svn каталоги в подкаталогах, но не в текущей директории «» (как * получает расширен только «видимые» файлы перед передачей очернить

Я попытался

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

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

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

(с использованием Баш на Linux SLES-11 (2.6.27.19)

+2

Может быть, это Ques принадлежит к суперпользователю? –

ответ

5

Вы можете включать скрытые каталоги, возвратившись каталог и выполнив команду:

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

Предполагая, что каталог вы хотели GZIP был называется рабочее пространство

+0

И это позволяет избежать проблемы с изменением файла. –

+0

Не работает, если пользователь не имеет права на запись в родительской папке. –

37

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

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

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

+0

@Micha создайте скрипт bash для архивирования и копирования файла после –

+1

Вам не хватает-в -czf, я думаю. – UpTheCreek

1

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

ls $HOME/* 

и

ls $HOME/*(D) 

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

ls $HOME/* $HOME/.* 

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

+0

В bash используйте '. ?? *' для соответствия всем файлам точек, а не '.' и' ..'. Это не дает одиночные текстовые файлы (например, '.a'). Чтобы получить их, используйте более сложные '. [^.] *'. –

4

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

tar -czf workspace.tar.gz . 

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

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

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

+0

Хорошо, я добавлю исправление для этого :) –

+0

И если вам нужно иметь возможность запускать это повторно, добавьте 'rm workspace.tar.gz' перед линией tar. –

6

Вы можете исправить . форму с помощью --exclude:

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

не работает, если файл создается. –

+0

На самом деле это сработало для меня ... – siserte

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

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

39

Не создавайте архивный файл в каталоге вы упаковывали:

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 .. никогда не было альтернативного значения.)


Один комментарий в обсуждении говорит:

I [...] нужно исключить верхний каталог, и я [...] нужно поместить смолу в основной каталог.

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

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

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

Очень хорошее резюме предыдущих ответов. –

+0

Хороший ответ, но у меня есть ситуация, когда я вынужден запускать эту команду в каталоге, который должен быть упакован. У меня есть недопустимые разрешения для запуска его снаружи. – Hexodus

-1

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

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

find . -maxdepth 1 найдет все файлы/каталоги/символьные ссылки/и т.д. в текущем каталоге и запустить команду, указанную -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 
+0

-J - --xz в руководстве; в сочетании с -c - это только начало того, что компьютер назовет «забавой» :) – Ricalsin

+0

Ха-ха, мой мини-сервер у себя дома ограничен ограниченным дисковым пространством, чем у процессора :) Хорошая точка; Я поменяю его на использование gzip. –

4

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

Минимальная дегтя:

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

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

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

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

+0

Спасибо! Saved ma life – Steven

15

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

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

Но теперь он жалуется, что файл «.» изменен во время чтения. Могу ли я быть уверенным, что все файлы включены? – Jaan

0

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

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

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

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

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

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

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

7

Есть несколько шагов, чтобы взять с собой:

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

Комбинированное это приводит к следующему сценарию:

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

Я прочитал все ответы и комментарии, и это самый лучший способ создать архив в той же директории. Из этого ответа я также понял, почему эта ошибка происходит. –

0

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

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

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

Смежные вопросы