Как избежать скопления файлов при создании архива tar - PullRequest
2 голосов
/ 14 июля 2009

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

Как правило, я бы использовал файловый ролик, но установленная версия немного проигрывает (использует 1,1 ГБ памяти), и я не системный администратор.

Я посмотрел --confirmation и --interactive, но меня спрашивает, хочу ли я добавить файл x в архив, а не перезаписывать существующий файл. Например,

tar --interactive -czvf innocent_text_file.txt foo*

Спросит меня о каждом файле, но будет рад перезаписать innocent_text_file.txt

Есть ли переключатель, который действует как -i для cp?

Примечание Я спрашиваю о создании архива, а не об извлечении архива.

Разъяснение Что меня беспокоит, так это то, что я случайно сделал что-то подобное

tar -czvf * #Don't do this!

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

cp -i * #Don't do this!

проверит, не приведет ли это к перезаписи существующего файла.

Ответы [ 4 ]

1 голос
/ 30 марта 2010

Если я правильно понимаю ваш вопрос, я считаю, что это должно сработать:

tar -cv * | gzip> myfile.tgz

1 голос
/ 14 июля 2009

Если я правильно понял ваш вопрос, это должно сработать

-k, --keep-old-files сохранить существующие файлы; не перезаписывать их из архива

0 голосов
/ 14 июля 2009

Это элементы управления перезаписью при извлечении из tar.

Overwrite control:

-k, --keep-old-files  don't replace existing files when extracting
  --keep-newer-files  don't replace existing files that are newer than
                      their archive copies
  --no-overwrite-dir  preserve metadata of existing directories
  --overwrite         overwrite existing files when extracting
  --overwrite-dir     overwrite metadata of existing directories when
                      extracting (default)
  --recursive-unlink  empty hierarchies prior to extracting directory
  --remove-files      remove files after adding them to the archive

Но вы ссылаетесь на операции cp -i и tar c для справки.
Это означает, что вы заинтересованы в обновлении архива, который не перезаписать существующую копию в tar новой версией. Я подозреваю, что контроль не доступен напрямую с tar.
Я также удивляюсь необходимости такой схемы.

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

cd base/dir/to/be/tarred 
tar tf path/to/files.tar | sort > archived-files.lst
find . -type f | sort > files.lst
diff archived-files.lst files.lst | grep "^>" | cut -c 3- > new.lst
tar uf -T new.lst

Обратите внимание, что update работает только для несжатых архивов.
Так что, если ваш архив сжимается через gunzip / bunzip2, то перед выполнением этой последовательности, в зависимости от обстоятельств.
и затем снова сожмите его в конце.

0 голосов
/ 14 июля 2009

А как насчет "u" (обновить) вместо "c" (создать)? например, tar -uzvf

Это должно добавить (и перезаписать) файл, только если он более новый, чем файл в архиве.

...