715просмотров
92.0%от подписчиков
25 апреля 2025 г.
Score: 787
Продолжим обсуждение - примером "продвинутой" команды может служить обновление файла в архиве, использующее обычную операцию добавления -r/--append. Обновление файла в архиве реализовано через дописывание новой версии файла в конец архива под тем же именем: tar может содержать сразу несколько копий одного файла. Распаковка файлов происходит тоже последовательно, с начала архива, и в результате, поочерёдно извлекая файлы из архива, операция -x создаёт только последний файл, который перетрёт все извлечённые ранее:
# Change contents of d.txt and update the file
$ echo 321 > a/b/c/d.txt
$ tar -rf archive.tar a/b/c/d.txt # See 2 versions here
$ tar -vtf archive.tar
drwxrwxr-x mint/mint 0 2025-04-24 00:01 a/
drwxrwxr-x mint/mint 0 2025-04-24 00:01 a/b/
drwxrwxr-x mint/mint 0 2025-04-24 00:01 a/b/c/
-rw-rw-r-- mint/mint 4 2025-04-24 00:01 a/b/c/d.txt
-rw-rw-r-- mint/mint 4 2025-04-24 00:21 a/b/c/d.txt # tar -x would create the last version of d.txt
$ rm -rf a/
$ tar -xf archive.tar
$ cat a/b/c/d.txt
321 Что интересно, операция извлечения файла действительно сначала создаст старую версию файла, и затем заменит её новой. Это видно, если использовать ключик -O/--to-stdout, печатающий содержимое файлов вместо их создания:
$ tar -xf archive.tar a/b/c/d.txt -O
123
321
Извлечь конкретную версию можно, указав её номер при помощи ключа --occurence:
# Note creation time
$ tar -vtf archive.tar --occurrence=1 a/b/c/d.txt
-rw-rw-r-- mint/mint 4 2025-04-24 00:01 a/b/c/d.txt # Extract file to stdout: old contents!
$ tar -xf archive.tar --occurrence=1 a/b/c/d.txt -O
123 # New contents are here as well
$ tar -xf archive.tar --occurrence=2 a/b/c/d.txt -O
321
Этакий бекап для бедных :) Кроме того, самому архиву можно назначать метку. Это может пригодиться, чтобы, например, наверняка сохранить время создания бекапа:
$ tar -cf backup.tar a/ -V "Created at $(date)" # --list shows the label!
$ tar -tf backup.tar
created at Thu Apr 24 23:23:04 MSK 2025
a/
a/b/
a/b/c/
a/b/c/d.txt Утилита GNU tar предлагает огромное количество прочих полезных действий, применение которым найти уже сложнее, и не умещаются в заметку. Скажем, tar можно заставить вызвать интерактивную сессию Bash
# Press ! after prompt
$ tar -cf tmp.tar a/ -L 2
Prepare volume #2 for ‘tmp.tar’ and hit return: ~
$ echo SHLVL
2
или разбить архив на несколько файлов, каждый из которых поместить на отдельный диск - на случай, если архив слишком большой. Документация GNU tar однозначно заслуживает изучения. Если вам приходилось использовать непопулярные возможности tar, буду рад изучить их в комментариях к заметке. Уверен, найдутся действительно стоящие идеи!