Создать архив с датой linux
Я пытаюсь добавить текущую дату в конец имени файла следующим образом:
Вот что у меня так далеко:
Однако все, что я получаю, это имя файла, и оно ничего не добавляет. Как добавить текущую дату к имени файла?
Более чем вероятно, это ваше использование set . Это назначит 'today', '=' и вывод date программы позиционным параметрам (или аргументам командной строки). Вы хотите просто использовать оболочку C (которую вы помечаете как «bash», так что скорее всего нет), вы захотите использовать:
Обратите внимание на отсутствие пробелов вокруг знака равенства.
Вы также не хотите использовать & в конце ваших утверждений; что заставляет оболочку не ждать завершения команды. Особенно, когда один полагается на следующий. Команда find может потерпеть неудачу, потому что она запускается до mkdir .
Спасибо за этого приятеля, теперь он работает на 100% нормально, привет за хедз-ап и и MkDirСкрипт Bash для вставки даты в имя файла:
Этот код Bash в файле называется a.sh
При запуске печатает:
Пояснение к коду:
Интерпретируйте скрипт с помощью интерпретатора / bin / bash. Создайте новую переменную с именем today. Выполните команду date, передав флаги Y, m, d, H, M, S для настройки вывода. Поместите результат в переменную даты.
Создайте новую переменную с именем filename, окружите переменную $ today остальным текстом статического имени файла. затем введите имя файла на экран.
Втирайте его в однострочник, чтобы увеличить lulz:
Вы, кажется, перепутали несколько вещей.
set today = 'date +%Y' выглядит как синтаксис tcsh, но даже в tcsh он присваивает строку date +%Y переменной today , он не запускает date команду. Поскольку вы, вероятно, используете bash или какую-либо другую оболочку POSIX, синтаксис присваивания today=some_value (без пробелов вокруг знака равенства). Чтобы запустить команду и назначить ее вывод переменной, используйте подстановку команды :
(Я также завершил спецификацию даты). Вы можете использовать обратные кавычки вместо долларовых скобок, но это может привести к тому, что они будут визуально перепутаны с прямыми кавычками, а правила, когда вам нужны кавычки внутри команды с обратными кавычками, довольно сложны и зависят от реализации, поэтому лучше не придерживаться $(…) (что имеет тот же эффект с более разумным синтаксисом).
Вы использовали & в конце несколько команд. Это заставляет команду выполняться в фоновом режиме, что здесь не нужно. Я подозреваю, что вы имели в виду && , что означает выполнение следующей команды, только если первая команда прошла успешно.
Альтернативой использованию && после каждой команды является запуск вашего скрипта set -e . Это говорит оболочке прекратить выполнение скрипта, как только любая команда вернет ненулевой статус (за исключением команд в if условиях и нескольких других случаях).
Ваша find команда в порядке, но, вероятно, не делает то, что вы собираетесь делать (хотя я не знаю точно, что это такое).
Вы создаете каталог с помощью, mkdir а затем сразу же просматриваете его find . Это не будет полезно, если каталог уже существует. Вы имели в виду создать каталог для сегодняшних журналов и переместить последние файлы из The_Logs каталога под названием, например The_Logs.2012-02-11 ?
Или вы хотели переименовать сегодняшние файлы журналов, чтобы добавить суффикс $today ? Это требует вычисления разных имен файлов для каждого файла для перемещения.
Обратите внимание, что я использовал -mtime для перемещения файлов в зависимости от времени их изменения, а не -atime от времени последнего чтения файла (если ваша система отслеживает это, а если нет, то время может быть уже как время изменения).
В наши дни мы сталкиваемся с файлами архивов очень часто и на всех платформах: Windows, Mac или Linux. Это могут быть программы, резервные копии систем или баз данных или просто архив файлов. Нам также часто приходится создавать свои архивы в Linux, чтобы передать несколько файлов друзьям или загрузить на файлообменник. В виде архивов распространяются пакеты программ, исходные коды, а также много других файлов, распространяемых на просторах интернета. Научиться выполнять архивирование файлов в Linux через терминал очень важно, возможно это вам понадобиться, когда не будет доступа к графическому интерфейсу, или просто со временем в терминале станет более приятно работать.
В этой инструкции я хочу подробно рассмотреть утилиты для архивирования в Linux, мы рассмотрим не только самую популярную и универсальную утилиту - tar, но и другие менее известные, а также популярные алгоритмы сжатия.
Архивирование в Linux
Важно отметить, что архивирование в linux это не одно и то же что и сжатие файлов linux. Архивирование - это объединение нескольких небольших файлов в один, с целю более удобной последующей передачи, хранения, шифрования или сжатия. Как я уже сказал, архивация выполняется специальными утилитами. Мы не будем трогать архивацию файлов в графическом интерфейсе, вы с ними разберетесь сами, наша тема - терминал.
Самой популярной для Linux утилитой для архивации есть tar. Она используется почти везде, для архивации исходников, упаковки пакетов. Для сжатия используются другие утилиты, в зависимости от алгоритма сжатия, например, zip, bz, xz, lzma и т д. Сначала выполняется архивация, затем сжатие, отдельными программами. Автоматический запуск некоторых утилит сжатия для только что созданного архива поддерживается в tar и других подобных программах с помощью специальных опций.
Также полезной возможностью архивации есть шифрование. Но теперь давайте рассмотрим какие существуют утилиты, с помощью которых выполняется архивирование файлов linux и как ими пользоваться.
Tar - это стандартная утилита, с помощью которой выполняется архивирование файлов Linux. Постепенно из небольшой программы архивации она превратилась в мощный инструмент, поддерживающий работу со многими вариантами архивов и алгоритмами сжатия. Программа поддерживает большое количество параметров. Давайте рассмотрим ее синтаксис и основные параметры:
$ tar опции f файл_для_записи /папка_файлами_для_архива
А теперь разберем основные опции:
- A - добавить файл к архиву
- c - создать архив в linux
- d - сравнить файлы архива и распакованные файлы в файловой системе
- j - сжать архив с помощью Bzip
- z - сжать архив с помощью Gzip
- r - добавить файлы в конец архива
- t - показать содержимое архива
- u - обновить архив относительно файловой системы
- x - извлечь файлы из архива
- v - показать подробную информацию о процессе работы
- f - файл для записи архива
- -C - распаковать в указанную папку
- --strip-components - отбросить n вложенных папок
Теперь давайте рассмотрим архивирование файлов в Linux. Чтобы создать архив используйте такую команду:
tar -cvf archive.tar.gz /path/to/files
А чтобы распаковать архив tar linux:
tar -xvf archive.tar.gz
Очень просто запомнить для упаковки используется опция c - Create, а для распаковки - x - eXtract.
Сжатый архив создается точно так же, только с опцией -z, это в случае, если использовалось шифрование gizp, если нужно bzip то применяется опция -j:
tar -zcvf archive.tar.gz /path/to/files
$ tar -zxvf archive.tar.gz
Например, рассмотрим как заархивировать папку в Linux:
tar -zcvf home.tar.gz
Хотя можно поступить по-другому, тот же архив мы получим если сначала создать обычный архив с помощью tar, а потом сжать его утилитой для сжатия, только здесь мы получаем больше контроля над процессом сжатия:
Также можно убрать сжатие:
Утилиты сжатия мы рассмотрим ниже.
Чтобы добавить файл в архив используйте:
tar -rvf archive.tar file.txt
Для извлечения одного файла синтаксис тот же:
tar -xvf archive.tar file.txt
Можно извлечь несколько файлов по шаблону соответствия с помощью параметра wildcard, например, извлечем все php файлы:
tar -xvf archive.tar --wildcards '*.php'
По умолчанию распаковать архив tar linux можно в текущую папку с именем архива, чтобы распаковать в нужную папку используйте ключ -C:
tar -xvf archive.tar -C /path/to/dir
Стандартную утилиту рассмотрели, теперь кратко рассмотрим ее альтернативы. Их не так много, и большинство из них уже устаревшие.
Shar позволяет создавать самораспаковывающиеся архивы. По сути, это скрипт оболочки, и для распаковки ему необходима оболочка Bash или другая совместимая с Bourne Shell. У Shar есть несколько преимуществ, но также он потенциально небезопасный, так как архив представляет собой исполняемый файл.
- -o - сохранять архив в файл вместо стандартного вывода
- -l - ограничить размер выходного файла
- -L - ограничить размер выходного файла и разбить его на части
- -n - имя архива не будет включено в заголовок
- -a - разрешить автоматическую генерацию заголовков
Примеры использования shar для того чтобы заархивировать папку linux:
Создаем shar архив:
shar file_name.extension > filename.shar
Распаковываем shar архив:
ar - утилита для создания и управления архивами. В основном используется для архивации статических библиотек, но может быть использована для создания любых архивов. Раньше использовалась довольно часто но была вытеснена утилитой tar. Сейчас используется только для создания и обновления файлов статических библиотек.
- - d - удалить модули из архива
- - m - перемещение членов в архиве
- - p - напечатать специфические члены архива
- - q - быстрое добавление
- - r - добавить члена к архиву
- - s - создать индекс архива
- - a - добавить новый файл к существующему архиву
Теперь рассмотрим примеры использования. Создадим статическую библиотеку libmath.a из объектных файлов substraction.o и division.o:
ar cr libmath.a substraction.o division.o
Теперь извлечем файлы из архива:
Таким образом, можно распаковать любую статическую библиотеку.
cpio - означает Copy in and out (скопировать ввод и вывод). Это еще один стандартный архиватор для Linux. Активно используется в менеджере пакетов Red Hat, а также для создания initramfs. Архивация в Linux для обычных файлов с помощью этой программы не применяется.
- -a - сбросить время обращения к файлам после их копирования
- -A - добавить файл
- -d - создать каталоги при необходимости
Пример использования. Создаем cpio архив:
file1.o file2.o file3.o
ls | cpio -ov > /path/to/output_folder/obj.cpio
cpio -idv < /path/to folder/obj.cpio
Архивирование папки linux выполняется также само.
Сжатие архивов в Linux
Как создать архив в linux рассмотрели. Теперь давайте поговорим о сжатии. Как я говорил, для сжатия используются специальные утилиты. Рассмотрим кратко несколько из них
Чаще всего применяется Gzip. Это стандартная утилита сжатия в Unix/Linux. Для декомпрессии используется gunzip или gzip -d Сначала рассмотрим ее синтаксис:
$ gzip опции файл
$ gunzip опции файл
Теперь разберем опции:
- -c - выводить архив в стандартный вывод
- -d - распаковать
- -f - принудительно распаковывать или сжимать
- -l - показать информацию об архиве
- -r - рекурсивно перебирать каталоги
- -0 - минимальный уровень сжатия
- -9 - максимальный уровень сжатия
Примеры использования вы уже видели в описании утилиты tar. Например, выполним сжатие файла:
gzip -c файл > архив.gz
А теперь распакуем:
gunzip -c архив.gz
Но чтобы сжать папку в Linux вам придется сначала заархивировать ее с помощью tar, а уже потом сжать файл архива с помощью gzip.
bzip2 - еще одна альтернативная утилита сжатия для Linux. Она более эффективная чем gzip, но работает медленнее. Для распаковки используйте утилиту bunzip2.
Описывать опции bzip2 я не буду, они аналогичны gzip. Чтобы создать архив в Linux используйте:
В текущем каталоге будет создан файл file.bz2
Новый и высокоэффективный алгоритм сжатия. Синтаксис и опции тоже похожи на Gzip. Для распаковки используйте unlzma.
Еще один высокоэффективный алгоритм сжатия. Обратно совместимый с Lzma. Параметры вызова тоже похожи на Gzip.
Кроссплатформенная утилита для создания сжатых архивов формата zip. Совместимая с Windows реализациями этого алгоритма. Zip архивы очень часто используются для обмена файлами в интернете. С помощью этой утилиты можно сжимать как файлы, так и сжать папку linux.
$ zip опции файлы
$ unzip опции архив
Чтобы создать Zip архив в Linux используйте:
zip -r /path/to/files/*
А для распаковки:
Как видите архивирование zip в Linux не сильно отличается от других форматов.
Выводы
Теперь вы знаете все что нужно об архивации файлов в Linux. Мы рассмотрели только консольные команды, так сказать, чтобы была понятна суть. В графическом интерфейсе все еще проще. Если остались вопросы - задавайте их в комментариях.
На Unix (это Linux, Freebsd и др.) системах команда tar является главной архивирующей утилитой. Понимание множества опций этой команды позволит вам мастерски манипулировать архивами.
В этой статье я хотел бы рассмотреть разные примеры, включающие в себя создание tar архива (с использованием gzip и bzip сжатия), распаковка отдельного файла или директории, просмотр содержимого tar архива, валидация целостности tar архива, выяснение разницы между tar архивом и файловой системой, вычисление размера архива перед его созданием и другие.
Создание архива с использованием команды tar
Создание и распаковка tar архива производится с использованием опции cvf. Вот так выглядит базовая команда для создания архива:
Разберем каждый ключ из опции по отдельности:
- c – создание нового архива
- v – вывод списка файлов к обработке
- f – имя файла архива
Чтобы создать архив сжатый gzip нужно использовать опцию cvzf. Предыдущая опция cvf абсолютно не использует какого-либо сжатия. Чтобы использовать gzip сжатие добавьте опцию z как показано ниже:
Лично предпочитаю всегда оставлять опцию cvf без изменений и только лишь в конце дописывать необходимые ключи если потребуется сжатие. Например, cvfz или cvfj. Так легче запоминается.
Теперь давайте создадим архив используя bzip2 сжатие:
gzip или bzip2? Сжатие и распаковка архива при помощи bzip2 занимает несколько больше времени и сам архив получается меньшего размера.
Создание tar архива с текущей датой в имени архива
Если вы создаете бекап, то очень важно знать, когда именно он был создан. Проще всего узнать об этом можно из его имени.
Распаковка архива с использованием команды tar
Для распаковки архива используется команда xvf:
Чтобы распаковать tar.gz используйте опцию xvfz:
Чтобы распаковать архив сжатый bzip2 используйте опцию xvfj:
Просмотр файлов в архиве tar
Чтобы посмотреть содержимое tar архива используйте опцию tvf.
Чтобы посмотреть содержимое архива сжатого при помощи gzip воспользуйтесь опцией tvfz
Чтобы посмотреть содержимое архива сжатого при помощи bzip2 воспользуйтесь опцией tvfj
Извлечение отдельного файла из tar, tar.gz, tar.bz2 архивов
Бывают ситуации, когда из большого архива требуется извлечь только 1 файл:
Для сжатых gzip и bzip2 архивов соответственно используйте:
Извлечение отдельной папки из tar, tar.gz, tar.bz2 архивов
Извлечение отдельной папки, включая все подпапки и файлы, производится также, как и извлечение отдельного файла:
Чтобы извлечь несколько папок из архива указывайте их имена по порядку:
Для сжатых архивов то же самое, только с использованием соответственно дополнительных ключей:
Извлечение группы файлов из tar, tar.gz, tar.bz2 архивов с использованием регулярных выражений
Чтобы извлечь группу файлов по определенных признакам в имени вы можете использовать регулярные выражения. К примеру, давайте извлечем из архива все файлы с расширением html.
Добавление файла или папки в существующий архив tar
Для добавления нового файла или папки в уже существующий архив используйте опцию -r:
Добавление папки проводится по аналогии:
Помните, что операция добавления файлов и папок работает только для не сжатых tar архивов.
Tar - самая удобная, простая для понимания и быстрая команда для архивирования файлов и папок. Поскольку большинство сайтов расположены на серверах с ОС Linux, чаще всего данную команду используют для создания резервных копий сайтов и важных файлов проекта. В данной статье я расскажу про особенности работы с командой tar, выборочное (инкрементное) резервное копирование, автоматизацию создания архивов и многое другое.
Итак, как создать архив в Linux, используя команду tar
Для более полного понимания работы tar, давайте для начала создадим тестовую папку, в которой создадим множество других папок:
А затем наполним её файлами, чтобы нам было с чем экспериментировать:
С помощью этих двух команд мы создали папку test , в ней разместили 100 папок вида dir-001 .. dir-100 и в каждую из 100 папок поместили файлы вида file-A.txt .. file-Z.txt
Теперь давайте выполним команду для архивирования:
В той папке, в которой мы находимся, появится архив test.tgz , в котором будет папка test и все вложенные в неё папки. Флаг " c " внутри команды означает "создать архив", " z " - сжать файлы. Флаг " f " ничего не означает и присутствует во всех командах, связанных с tar .
Если мы захотим посмотреть содержимое нашего архива - можно воспользоваться командой:
которая отобразит содержимое нашего архива в простом формате отображения. Для просмотра подробного списка архива добавим флаг " v ":
А теперь давайте распакуем архив. Для этого сначала есть смысл удалить имеющуюся папку test (используем команду rm -rf test ), а затем используем команду извлечения данных из нашего архива:
После этого архив распакуется и у нас снова появится папка test со всем её содержимым.
Кстати, мы можем извлекать файлы как по одному, так и выборочно. Например, извлекаем 1 файл:
А если мы хотим извлечь несколько файлов, то при использовании параметра --wildcards мы имеем возможность прописать групповые символы ( * и прочие ). Допустим, мы хотим извлечь все файлы с именем file-A.txt из всех 100 наших папок. Для этого используем команду:
Обратите внимание на то, что мы должны указать относительный путь к нашим файлам. Т.е. путь без ' / ' в котором мы должны указать полный путь, исходя из структуры нашего имеющегося архива.
Групповые символы - это отличная возможность извлекать из больших архивов отдельные группы файлов, например, за доли секунд мы можем извлечь из огромного архива все файлы изображений.
Есть один ньюанс, который нужно понимать при работе с архиватором. Если при создании архива мы укажем абсолютный путь (от корня диска), то при создании архива в него будут включена вся структура каталогов, начиная от корня диска. Чтобы было понятнее, давайте попробуем это на деле. Сначала давайте выполним команду pwd , чтобы у нас отобразился полный путь к текущей рабочей директории. Далее выполняем команду:
Обратите внимание на получившийся архив: все файлы имеют абсолютные пути, например, такого вида: /home/den/Desktop/test/dir-001/file-A.txt
Этот момент обязательно нужно учитывать при создании архивов и использовать именно тот вариант, который необходим для конкретно данной ситуации.
Использование tar вместе с find
Команду tar часто используют вместе с командой find (с помощью которой мы ищем файлы и папки). Например, мы хотим найти в папке все файлы с именем file-A.txt и добавить их внутрь имеющего архива, то это можно сделать командой:
В данном примере флаг " r " используется для инкрементного добавления файлов внутрь имеющегося архива. Отличная и очень удобная на практике возможность! К примеру, мы можем с помощью find находить файлы, созданные не позже опреденённой даты и добавлять их к нашему архиву.
Также, tar умеет считывать данные со стандартного ввода и вывода. Пример:
Когда архиватору tar передается имя файла - (дефис), то под этим имеется ввиду либо стандартный ввод, либо стандартный вывод (и зависит это от контекста).
А ещё, можно использовать tar для передачи файлов через SSH . Пример:
Здесь мы скопировали с удалённой машины папку ' ИмяПапки ' в текущий рабочий каталог. С помощью SSH мы можем выполнить любой запрос на удаленной машине. Используя это, мы с помощью tar создали архив (флаг " c ") и вывели его не в файл, а в стандартный вывод (флаг " f " с дефисом в качестве аргумента), вследствие чего архив передается через SSH-туннель на локальную машину. В локальной машине мы вызываем tar для того чтобы распаковать архив (флаг " x "), полученный со стандартного ввода.
Автоматическое резервное копирование, с помощью tar и cron
Для создания регулярной резервной копии мы можем настроить планировщик cron . Если у Вас стандартный хостинг без root-доступа, то cron настраивается в панели управления Вашего хостинга. Если же у Вас выделенный сервер, тогда делаем всё стандартным образом через crontab -e
Пример записи cron для резервного копирования 1 раз в неделю:
В данном примере мы раз в неделю, в полночь, архивируем папку (включая всё её содержимое) по адресу /home/den/Desktop/test и размещаем полученный архив внутрь папки /home/den/ , вписывая при этом в имя архива текущую дату.
Подписывайтесь на группу в ВКонтакте, вступайте в сообщество на Facebook, чтобы всегда быть в курсе актуальных выпусков
W e b d e v e l o p m e n t b l o g !
Читайте также: