Tar - самая удобная, простая для понимания и быстрая команда для архивирования файлов и папок. Поскольку большинство сайтов расположены на серверах с ОС Linux, чаще всего данную команду используют для создания резервных копий сайтов и важных файлов проекта. В данной статье я расскажу про особенности работы с командой tar, выборочное (инкрементное) резервное копирование, автоматизацию создания архивов и многое другое.
Итак, как создать архив в Linux, используя команду tar
Для более полного понимания работы tar, давайте для начала создадим тестовую папку, в которой создадим множество других папок:
mkdir -p test/dir-{00{1..9},0{10..99},100}
А затем наполним её файлами, чтобы нам было с чем экспериментировать:
touch test/dir-{00{1..9},0{10..99},100}/file-{A..Z}.txt
С помощью этих двух команд мы создали папку test, в ней разместили 100 папок вида dir-001 .. dir-100 и в каждую из 100 папок поместили файлы вида file-A.txt .. file-Z.txt
Теперь давайте выполним команду для архивирования:
tar czf test.tgz test
В той папке, в которой мы находимся, появится архив test.tgz, в котором будет папка test и все вложенные в неё папки. Флаг "c" внутри команды означает "создать архив", "z" - сжать файлы. Флаг "f" ничего не означает и присутствует во всех командах, связанных с tar.
Если мы захотим посмотреть содержимое нашего архива - можно воспользоваться командой:
tar tf test.tgz
которая отобразит содержимое нашего архива в простом формате отображения. Для просмотра подробного списка архива добавим флаг "v":
tar tvf test.tgz
А теперь давайте распакуем архив. Для этого сначала есть смысл удалить имеющуюся папку test (используем команду rm -rf test), а затем используем команду извлечения данных из нашего архива:
tar xf test.tgz
После этого архив распакуется и у нас снова появится папка test со всем её содержимым.
Кстати, мы можем извлекать файлы как по одному, так и выборочно. Например, извлекаем 1 файл:
tar xf test.tgz путь_к_файлу
А если мы хотим извлечь несколько файлов, то при использовании параметра --wildcards мы имеем возможность прописать групповые символы (* и прочие). Допустим, мы хотим извлечь все файлы с именем file-A.txt из всех 100 наших папок. Для этого используем команду:
tar xf test.tgz --wildcards 'test/dir-*/file-A.txt'
Обратите внимание на то, что мы должны указать относительный путь к нашим файлам. Т.е. путь без '/' в котором мы должны указать полный путь, исходя из структуры нашего имеющегося архива.
Групповые символы - это отличная возможность извлекать из больших архивов отдельные группы файлов, например, за доли секунд мы можем извлечь из огромного архива все файлы изображений.
Есть один ньюанс, который нужно понимать при работе с архиватором. Если при создании архива мы укажем абсолютный путь (от корня диска), то при создании архива в него будут включена вся структура каталогов, начиная от корня диска. Чтобы было понятнее, давайте попробуем это на деле. Сначала давайте выполним команду pwd, чтобы у нас отобразился полный путь к текущей рабочей директории. Далее выполняем команду:
tar czf test.tgz путь_к_текущей_директории_далее_слэш_и_имя_папки
Например:
tar czf test.tgz /home/den/Desktop/test
Обратите внимание на получившийся архив: все файлы имеют абсолютные пути, например, такого вида: /home/den/Desktop/test/dir-001/file-A.txt
Этот момент обязательно нужно учитывать при создании архивов и использовать именно тот вариант, который необходим для конкретно данной ситуации.
Использование tar вместе с find
Команду tar часто используют вместе с командой find (с помощью которой мы ищем файлы и папки). Например, мы хотим найти в папке все файлы с именем file-A.txt и добавить их внутрь имеющего архива, то это можно сделать командой:
find test -name 'file-A.txt' -exec tar rf test.tgz '{}' '+'
В данном примере флаг "r" используется для инкрементного добавления файлов внутрь имеющегося архива. Отличная и очень удобная на практике возможность! К примеру, мы можем с помощью find находить файлы, созданные не позже опреденённой даты и добавлять их к нашему архиву.
Также, tar умеет считывать данные со стандартного ввода и вывода. Пример:
find test -name 'file-A' | tar czf test.tgz -T -
Когда архиватору tar передается имя файла - (дефис), то под этим имеется ввиду либо стандартный ввод, либо стандартный вывод (и зависит это от контекста).
А ещё, можно использовать tar для передачи файлов через SSH. Пример:
ssh логин@хост_удалённой_машины 'tar cf - ИмяПапки' | tar xf -
Здесь мы скопировали с удалённой машины папку 'ИмяПапки' в текущий рабочий каталог. С помощью SSH мы можем выполнить любой запрос на удаленной машине. Используя это, мы с помощью tar создали архив (флаг "c") и вывели его не в файл, а в стандартный вывод (флаг "f" с дефисом в качестве аргумента), вследствие чего архив передается через SSH-туннель на локальную машину. В локальной машине мы вызываем tar для того чтобы распаковать архив (флаг "x"), полученный со стандартного ввода.
Автоматическое резервное копирование, с помощью tar и cron
Для создания регулярной резервной копии мы можем настроить планировщик cron. Если у Вас стандартный хостинг без root-доступа, то cron настраивается в панели управления Вашего хостинга. Если же у Вас выделенный сервер, тогда делаем всё стандартным образом через crontab -e
Пример записи cron для резервного копирования 1 раз в неделю:
@weekly /usr/bin/tar czf /home/den/archive-`date+"\%d_\%m_\%y"`.tgz /home/den/Desktop/test
В данном примере мы раз в неделю, в полночь, архивируем папку (включая всё её содержимое) по адресу /home/den/Desktop/test и размещаем полученный архив внутрь папки /home/den/, вписывая при этом в имя архива текущую дату.
Подписывайтесь на группу в ВКонтакте, вступайте в сообщество на Facebook, чтобы всегда быть в курсе актуальных выпусков
Web development blog!