Bash копирование файлов по дате
Иногда системным администраторам, программистам, web-дизайнерам и много кому ещё нужно запускать одни и те же команды или скрипт с некоторой периодичностью. Для таких целей используется специальная утилита Cron , встроенная во все дистрибутивы Unix. Пользоваться Cron’ом необычайно легко. Сейчас расскажу как.
Для начала создадим какой-нибудь простой bash-скрипт, например скрип резервного копирования и архивирования конфигурационных файлов, в моём случае конфигурационных файлов Apache2 и ftp-сервера.
mkdir / home / user / bash-scripts / backup
cp / etc / apache2 / apache2.conf / home / user / bash-scripts / backup / apache2.conf-backup
cp / etc / apache2 / sites-available / site / home / user / bash-scripts / backup / site-backup
cp / etc / proftpd / proftpd.conf / home / user / bash-scripts / backup / proftpd.conf-backup
tar cvvzf "/home/user/bash-scripts/backup-`date +%F-%X`.tar.gz" / home / user / bash-scripts / backup /
rm -r / home / user / bash-scripts / backup
Этот скрипт копирует конфигурационные файлы и архивирует их в папку, в названии которой присутствует дата и время сохранения. Назовём его ‘ backup-script ‘ а лежать он у нас будет в домашнем каталоге (/home/user/). Теперь нам надо чтобы этот скрипт запускался, ну допустим, каждые 10 минут. Для этого введём команду
Этой командой мы открываем для редактирования файл crontab для данного пользователя, в моём случае это user. Если нашему скрипту нужны права супер пользователя, то нужно редактировать crontab суперпользователя. Делается это командой
sudo crontab -u root -e
Ну и если заменить root а логин другого пользователя, мы будем редактировать его crontab .
Сразу напишу, чтобы посмотреть файл crontab введите команду.
Файл crontab имеет следующую структуру:
поле1 поле2 поле3 поле4 поле5 команда
Значения первых пяти полей:
1.минуты— число от 0 до 59
2.часы — число от 0 до 23
3.день месяца — число от 1 до 31
4.номер месяца в году — число от 1 до 12
5.день недели — число от 0 до 7 (0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс)
Все поля обязательны для заполнения. Не сложно догадаться что первые 5 отвечают за определения периодичности запуска команды, а последняя собственно команда или полный путь к скрипту. Таким образом, чтобы запустить наш скрипт резервного копирования раз в 10 минут надо вписать следующую строчку.
*/ 10 * * * * / home / user / backup-script
* - значит все возможные варианты, / служит для определения периодичности выполнения задания. Если нужно будет выполнять скрипт раз в 3 часа впишите в значения часы */3 а в минуты просто *, если раз в сутки — впишите */23 , ну почти сутки. Так же в одно поле можно вводить несколько значений через запятую, например если хотите выполнять скрипт 1ого, 5ого, и 25ог числа каждого месяца введите 1,5,25 вместо третей звёздочки. Ещё можно вводить промежуток времени, если ,допустим, в часы ввести 12-17 то скрипт будет выполняться с 12 до 17 включительно раз в час.
Ну вот и всё, в заключение пару примеров:
0 */ 3 * * 2,5 / home / user / backup-script
15 */ 3 * * * / home / user / backup-script
45 15 * * 1 / home / user / backup-script
13 13 13 * 5 / home / user / backup-script
30 00 * * 0 / home / user / backup-script
Частыми операциями в файловой структуре являются создание файлов и каталогов, их копирование, перемещение, переименование, а также удаление. Очевидно для подобных действий в командной оболочке Linux должны быть предусмотрены специальные команды.
Копирование файлов и каталогов
В Bash для копирования файлов используется команда cp (от "copy"), которой обычно передаются два аргумента:
адрес с именем исходного файла,
новый адрес с именем или просто адрес каталога, куда помещается копия.
Адрес может быть как абсолютным, так относительным. Если операции с файлами выполняются в текущем каталоге, то указывать адрес смысла нет. Пишется только имя исходного файла и имя копии. Поскольку файлов с одинаковыми именами и адресами быть не может, имя копии должно отличаться от имени исходного файла.
cp readme readme2
В данном случае создается копия файла readme, которая остается в той же директории под именем readme2.
cp readme Desktop/
В папку Desktop копируется файл readme. Здесь текущим является родительский Desktop'у каталог. Имена копии и файла оригинала будут совпадать, а вот полные адреса – нет.
cp /home/irina/tux.jpg /mnt/D/pingvin.jpg
Здесь копируется файл из одного каталога в другой, используются абсолютные адреса, имя копии изменяется.
Если надо скопировать несколько разных файлов в один и тот же каталог, то после команды cd сначала перечисляются все файлы-оригиналы, а последним указывается каталог, куда помещаются копии. Понятно, что при таком групповом действии имена файлов изменить нельзя.
Чтобы скопировать каталог со всем его содержимым, необходимо использовать ключ -r команды cp:
cp -r ./letters ./oldletters
Перемещение и переименование
В Bash-оболочке Linux для перемещения и переименования используется одна и та же команда – mv (от "move" – перемещать). Переименование можно рассматривать как частный случай перемещения, ведь по-сути изменяется полный адрес файла, что равносильно перемещению, даже если файл остается в том же каталоге.
Также как в случае cp, для mv необходимо указать пару аргументов. Выбор между перемещением и переименованием зависит от того, что это за аргументы. При перемещении файл меняет свой адрес, следовательно, если в первом и втором аргументах указаны разные адреса, то произойдет перемещение. Если адреса одинаковые, а различаются только имена, происходит переименование. Кроме того, перемещение может быть совмещено с переименованием.
В случае перемещения без переименования во втором аргументе указывается только каталог места назначения.
mv document.txt Work
mv document.txt Work/doc23.txt
Здесь в первом случае файл document.txt перемещается в каталог Work. Во-втором случае одновременно происходит перемещение файла и его переименование: файл document.txt перемещается в директорию Work и получает новое имя doc23.txt.
При использовании команды mv для переименования в качестве второго аргумента указывается новое имя:
mv order.txt orderNew.txt
mv Work/list.odt Work/names.odt
Каталоги перемещаются и переименовываются по тому же принципу, что и файлы. Групповое перемещение файлов работает также, как с командой cp.
Создание файлов и каталогов
Новые директории создаются командой mkdir. Например, чтобы создать каталог Work в текущей директории необходимо выполнить следующую команду:
mkdir Work
или
mkdir ./Work
Существует множество способов создания файлов, обычно они создаются какой-либо программой. Если все же возникает необходимость создать пустой файл, сделать это можно с помощью программы touch. В качестве аргумента ей передается имя создаваемого файла. Еще один способ – перенаправление вывода какой-либо команды в файл. Пример:
Здесь программа cal выводит календарь на текущий месяц, а поскольку стоит знак перенаправления вывода, то вывод команды будет записан в файл January, находящийся в папке Work.
Удаление файлов и каталогов
Для удаления файлов используется команда rm. Например:
Командой rmdir можно удалить пустой каталог. Если же каталог не пуст, следует использовать команду rm с ключом -r:
Вопросы
У вас в каталоге есть файлы с разными расширениями. Вам надо группу файлов, имеющих одно и тоже расширение, скопировать в другой каталог. Как это сделать одной командой?
Какой ключ надо использовать, чтобы при перемещении случайно не перезаписать уже имеющийся в каталоге файл с таким именем?
Курс с ответами к заданиям и дополнительными уроками:
android-приложение, pdf-версия.
Копирование файлов - одна из задач, наиболее часто возникающих перед пользователями персонального компьютера. Конечно, можно открыть файловый менеджер, войти в нужную папку и скопировать файл с помощью контекстного меню - тут не о чем говорить. Но в этой статье я хотел бы рассмотреть копирование файлов в Linux с помощью терминала.
Не всегда есть доступ к файловому менеджеру: из-за различных поломок графическая оболочка на домашнем компьютере может быть недоступна, а на серверах используется только консольный интерфейс. К тому же копирование файлов Ubuntu через терминал намного эффективнее, и вы сами в этом убедитесь. Сегодня мы рассмотрим не только обычное копирование командой cp Linux, но и не совсем обычное: с помощью tar и find.
Утилита копирования файлов cp
Название утилиты cp - это сокращение от Copy, что означает копировать. Утилита позволяет полностью копировать файлы и директории.
Синтаксис и опции
Общий синтаксис cp выглядит вот так:
$ cp опции файл-источник файл-приемник
$ cp опции файл-источник директория-приемник/
После выполнения команды файл-источник будет полностью перенесен в файл-приемник. Если в конце указан слэш, файл будет записан в заданную директорию с оригинальным именем.
Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:
- --attributes-only - не копировать содержимое файла, а только флаги доступа и владельца;
- -f, --force - перезаписывать существующие файлы;
- -i, --interactive - спрашивать, нужно ли перезаписывать существующие файлы;
- -L - копировать не символические ссылки, а то, на что они указывают;
- -n - не перезаписывать существующие файлы;
- -P - не следовать символическим ссылкам;
- -r - копировать папку Linux рекурсивно;
- -s - не выполнять копирование файлов в Linux, а создавать символические ссылки;
- -u - скопировать файл, только если он был изменён;
- -x - не выходить за пределы этой файловой системы;
- -p - сохранять владельца, временные метки и флаги доступа при копировании;
- -t - считать файл-приемник директорией и копировать файл-источник в эту директорию.
Примеры копирования файлов в linux
Теперь, когда вы знаете основные опции, можно перейти к практике. Например, мы хотим скопировать некую картинку из домашней папки в подкаталог pictures:
Или можем явно указать имя новой картинки:
Копирование папок осуществляется с помощью ключа -r:
После выполнения этой команды копирования
/папка будет скопирована в папку
/Документы. Главное, не забывайте поставить слэш в конце выражения или использовать опцию -t. Иначе папка
/документы будет перезаписана.
По умолчанию команда cp Linux перезаписывает существующие файлы или папки, но можно заставить утилиту спрашивать, нужно ли перезаписывать каждый файл, если вы не уверены в правильности составления команды:
Есть и противоположная опция -n, означающая "никогда не перезаписывать существующие файлы".
Опция -u полезна в следующем случае: вы знаете или предполагаете, что в директории, куда копируется файл, есть старая его версия, тогда оператор -u выполнит замену на новую версию:
Сp также поддерживает специальные символы замены * и ?. Например, следующая команда скопирует все файлы, начинающиеся на test:
Если нужно применить более сложные регулярные выражения, придётся комбинировать утилиту cp с find или egrep.
В случае, если важно сохранить права доступа к файлу и его владельца, нужно использовать опцию -p:
Для упрощения использования команды можно применять синтаксис фигурных скобок. Например, чтобы создать резервную копию файла, выполните:
Будет создан файл с таким же именем и расширением .bak
По умолчанию в cp не отображается прогресс копирования файла, что очень неудобно при работе с большими файлами, но его можно легко посмотреть с помощью утилиты cv.
Копирование файлов по регулярным выражениям в Linux
В утилите find можно применять различные условия и регулярные выражения для поиска файлов. Я уже немного писал о ней в статье как найти новые файлы в Linux. Мы можем скопировать все найденные с помощью find файлы, вызвав для каждого из них команду cp. Например, копируем все файлы в текущей директории, содержащие в имени только цифры:
find . -name 1 -exec cp <>
Здесь точка указывает на текущую директорию, а параметр name задает регулярное выражение. Параметром exec мы задаем, какую команду нужно выполнить для обнаруженных файлов. Символ <> - подставляет имя каждого файла.
Но не find'ом единым такое делается. То же самое можно получить, запросив список файлов директории в ls, отфильтровав его по регулярному выражению egrep и передав имена файлов по очереди в cp с помощью xargs:
/ | egrep '[a-zA-Z]' | xargs cp -t
Это не совсем удобный способ копировать файлы Linux, но всё же он возможен. Будут скопированы все файлы из домашней директории, содержащие в имени только английские буквы.
Копирование содержимого файлов в Linux
Вы можете не только копировать сами файлы, но и управлять их содержимым. Например, склеить несколько файлов в один или разрезать файл на несколько частей. Утилита cat используется для вывода содержимого файла, в комбинации с операторами перенаправления вывода Bash вы можете выполнять копирование содержимого файла Linux в другой файл. Например:
cat файл1 > файл2
Если файл был не пустым, он будет перезаписан. Или мы можем склеить два отдельных файла в один:
cat файл1 файл2 > файл3
Специальное копирование файлов в Linux с помощью tar
Linux интересен тем, что позволяет выполнять одно и то же действие различными путями. Копирование в Linux тоже может быть выполнено не только с помощью cp. При переносе системных файлов в другой каталог, резервном копировании системных файлов и т.д. важно чтобы сохранились атрибуты, значения владельцев файлов и символические ссылки как они есть без какой-либо модификации.
tar cf - /var | ( cd /mnt/var && tar xvf - )
Здесь мы полностью копируем содержимое папки /var в папку /mnt/var. Так вы можете копировать папку Linux, причём абсолютно любую или даже целую операционную систему.
Выводы
Теперь вы знаете, как выполняется копирование файлов Ubuntu и в Linux в целом. Как видите, в терминале это выполняется намного быстрее и эффективнее, чем с помощью графического интерфейса, если помнить нужные команды. Если у вас остались вопросы, спрашивайте в комментариях!
Обычно у нас есть привычка сохранять много информации в виде файлов в нашей системе. Некоторые, скрытые файлы, некоторые хранятся в отдельной папке, созданной для простоты понимания, а некоторые как есть. Но все это заполняет наши каталоги; обычно настольный, что делает его похожим на беспорядок. Но проблема возникает, когда нам нужно найти конкретный файл, измененный в определенную дату и время в этой огромной коллекции.
Люди, знакомые с графическим интерфейсом пользователя, могут найти его с помощью диспетчера файлов, который перечисляет файлы в формате длинного списка, что позволяет легко понять, что мы хотели, но те пользователи, у которых есть привычка к черным экранам, или даже любой, кто работает на серверах, которые лишены графического интерфейса, будут нужна простая команда или набор команд, которые могли бы облегчить их поиск.
Настоящая красота Linux проявляется здесь, поскольку в Linux есть набор команд, которые при использовании по отдельности или вместе могут помочь в поиске файла или сортировке коллекции файлов по их имени, дате модификации, времени создания или даже любому другому. фильтр, который вы могли бы подумать о применении, чтобы получить свой результат.
Здесь мы раскроем реальную силу Linux, изучив набор команд, которые могут помочь отсортировать файл или даже список файлов по дате и времени.
Утилиты Linux для сортировки файлов в Linux
Вот некоторые базовые утилиты командной строки Linux, которых достаточно для сортировки каталога по дате и времени:
ls - перечисление содержимого каталога, эта утилита может отображать файлы и каталоги и даже может отображать всю информацию о их статусе, включая дату и время изменения или доступа, разрешения, размер, владельца, группу и т. д.
Мы уже рассмотрели множество статей о команде Linux ls и команде sort, вы можете найти их ниже:
- Изучите команду ls на 15 основных примерах
- Изучите 7 команд Advanced ls с примерами
- 15 полезных вопросов для собеседования по команде ls в Linux
sort - эту команду можно использовать для сортировки результатов любого поиска по любому полю или любому конкретному столбцу поля.
Мы уже рассмотрели две статьи о команде сортировки Linux, вы можете найти их ниже:
- 14 примеров команд «sort» в Linux - часть 1
- 7 полезных примеров команд Linux "sort" - часть 2
Эти команды сами по себе являются очень мощными командами, которые нужно освоить, если вы работаете на черных экранах и имеете дело с большим количеством файлов, просто чтобы получить тот, который вам нужен.
Некоторые способы сортировки файлов по дате и времени
Ниже приведен список команд для сортировки по дате и времени.
Приведенная ниже команда перечисляет файлы в формате длинного списка и сортирует файлы по времени модификации, начиная с самых новых. Для сортировки в обратном порядке используйте переключатель -r с этой командой.
Список файлов в каталоге на основе времени последнего доступа, т.е. на основе времени последнего доступа к файлу, а не изменения.
Список файлов в каталоге на основе времени последнего изменения информации о статусе файла или ctime . Эта команда сначала перечислит тот файл, любая информация о статусе которого, такая как: владелец, группа, разрешения, размер и т. Д., Была недавно изменена.
Если переключатель -a используется с вышеуказанными командами, они могут перечислять и сортировать даже скрытые файлы в текущем каталоге, а переключатель -r выводит вывод в обратном порядке.
Однако для более глубокой сортировки, такой как сортировка в выводе команды find, также можно использовать ls , но там sort оказывается более полезным, поскольку вывод может содержать не только файл имя, но любые поля по желанию пользователя.
Команды ниже показывают использование sort с командой find для сортировки списка файлов по дате и времени.
Чтобы узнать больше о команде find, перейдите по этой ссылке: 35 практических примеров команды find в Linux
Здесь мы используем команду find , чтобы найти все файлы в корневом каталоге (‘/’) , а затем распечатать результат как: месяц, в котором был осуществлен доступ к файлу, а затем имя файла. Из этого полного результата мы перечисляем 11 лучших записей.
Приведенная ниже команда сортирует вывод с использованием ключа в качестве первого поля, указанного в -k1 , а затем сортирует по месяцу, указанному перед ним M .
Здесь мы снова используем команду find , чтобы найти все файлы в корневом каталоге, но теперь мы распечатаем результат в виде: последней даты доступа к файлу, последнего доступа к файлу и затем имени файла. Из этого мы выберем 11 лучших записей.
Здесь мы снова используем команду find , чтобы вывести список из 11 файлов в корневом каталоге и распечатать результат в формате: время последнего обращения к файлу и затем имя файла.
Приведенная ниже команда сортирует вывод на основе первого столбца первого поля вывода, который является первой цифрой часа.
Эта команда сортирует вывод команды ls -l на основе 6-го поля по месяцам, а затем на основе 7-го поля, которое является датой, численно.
Заключение
Точно так же, обладая некоторыми знаниями о команде сортировки, вы можете отсортировать практически любой список на основе любого поля и даже любого столбца, который вам нужен. Это были некоторые приемы, которые помогут вам сортировать файлы по дате или времени. На их основе вы можете создавать свои собственные трюки. Однако, если у вас есть другой интересный трюк, вы всегда можете упомянуть об этом в своих комментариях.
Читайте также: