Программы
Как на Bash получить файлы, изменённые за сегодняшний день

Как на Bash получить файлы, изменённые за сегодняшний день

Bash имеет огромные возможности по программированию/скриптованию и администрированию операционной системы. Не важно: Linux это, FreeBSD, или MacOS – на Bash можно сделать многое.

Bash не всегда очевиден, но безусловно силён. Базовые концепции Unix-философии сделали написание скриптов и однострочников на нём сравнительно простым, а мощь программ – почти безграничной.

Но хватит пафоса, это лишь небольшой рецепт, в котором мы используем команду ls для получения списка файлов, однако, с параметром, о котором редко вспоминают: --time-style – получим вывод даты в удобном нам формате. А именно выполним следующую команду:

$ ls -al --time-style=+%D
total 122012
drwxrwxr-x  16 root   syslog  4096 11/27/19 .
drwxr-xr-x  14 root   root    4096 10/15/17 ..
-rw-r--r--   1 root   root       0 09/30/19 alternatives.log
-rw-r--r--   1 root   root     477 09/29/19 alternatives.log.1
-rw-r--r--   1 root   root     177 08/01/19 alternatives.log.2.gz
-rw-r--r--   1 root   root    3286 05/01/19 alternatives.log.3.gz
-rw-r--r--   1 root   root    1460 04/29/19 alternatives.log.4.gz
-rw-r--r--   1 root   root    3548 10/16/17 alternatives.log.5.gz
...

Так мы вывели дату последней модификации в американском стиле (MM/DD/YYYY). Теперь с помощью grep и date мы отфильтруем файлы, которые принадлежат именно к текущей дате:

$ ls -al --time-style=+%D | grep $(date +%D)
drwxrwxr-x  16 root   syslog              4096 11/27/19 .
drwxr-xr-x   2 root   root                4096 11/27/19 atop
-rw-r-----   1 syslog adm              2232669 11/27/19 auth.log
-rw-rw----   1 root   utmp            40578048 11/27/19 btmp
-rw-rw-r--   1 root   utmp              292292 11/27/19 lastlog
drwxr-xr-x   2 root   adm                 4096 11/27/19 nginx
-rw-r--r--   1 root   root                   0 11/27/19 popularity-contest.0
-rw-r--r--   1 root   root               33740 11/27/19 popularity-contest.new
-rw-r-----   1 syslog adm                34597 11/27/19 syslog
-rw-r-----   1 syslog adm              1027129 11/27/19 syslog.1
-rw-rw-r--   1 root   utmp                6528 11/27/19 wtmp

Но это только файлы за сегодня в текущей директории. Теперь добавим рекурсивный обход текущей директории, чтобы сделать ls -la на все файлы, что содержатся в текущей папке и подпапках:

find . -type f -print \
  | xargs ls -al --time-style=+%D \
  | grep $(date +%D)

С помощью find получаем список всех файлов, включая файлы поддиректорий. А xargs передаёт их аргументами нашей команде ls.

Если же вас не устраивает такой вывод столбиком с кучей лишних данных, а нужны только названия файлов – используем небольшую программку на awk:

find . -type f -print \
  | xargs ls -al --time-style=+%D \
  | grep $(date +%D)
  | awk 'BEGIN {FS="[ \t]+|\\|"} {print $7}'

– плюсом ко всему перечисленном ещё и делим по пробельным символам и выводим 7-ой столбец, где и находится имя файла.

Изображение Выучи 10 хороших привычек для работы в UNIX от IBM