У POSIX есть это, чтобы сказать о датах в ls
-l
списке ong:
<date and time>
Поле должно содержать соответствующую дату и временную метку , когда в последний раз был изменен файл. В локали POSIX поле должно быть эквивалентно выводу следующей команды date:
date "+%b %e %H:%M"
... если файл был изменен за последние шесть месяцев, или:
date "+%b %e %Y"
Принимая это во внимание и гарантируя, что если в имени файла есть какие-либо символы новой строки, они будут правильно добавлены в ls -q
опцию, указанную также в POSIX , подготовить регулярное выражение для ls
результата сравнительно легко find
:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
для этого вы будете возвращать только те строки, которые содержат строки, представляющие либо сегодняшние, либо вчерашние даты. Следующая команда добавляет к этому немного:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
варианты состоят из:
-a
вернуть все файлы в каталоге, включая те, которые начинаются с .dot
-l
длинный список
-R
рекурсивный список всех дочерних каталогов
-c
отображать время модификации, а не время доступа
-q
возвращать глобус оболочки ?
вместо непечатных или \t
ab символов в имени файла
Эти результаты передаются по |pipe
файлу, sed
которому соответствуют только:
- Пустая строка, предшествующая пути и следующей строке
- Строки, начинающиеся с
-
(другими словами - не d
для каталога), которые также содержат ваши date
.
- Он не печатает строки пути, если только каталог, который они называют, на самом деле не содержит файлов, которые вы отфильтровали.
Вывод выглядит так:
ls -alRcq --color=always |
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv 2086 Jul 4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv 2657 Jul 4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv 681 Jul 5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul 5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul 4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul 4 13:34 shot-2014-06-22_17-11-06.jpg
./.cache/efreet:
-rw------- 1 mikeserv mikeserv 37325 Jul 4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv 37325 Jul 4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 16037 Jul 4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv 3117 Jul 4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul 4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv 18589 Jul 4 23:30 icons_hicolor_localhost.eet
./.config:
-rw-r--r-- 1 mikeserv mikeserv 30 Jul 4 19:10 pavucontrol.ini
./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul 4 13:36 conf.tar.lz4.bak
Да, это даже работает с LS_COLORS
- что, вероятно, является низким приоритетом для вас cron
, но, эй, ваши варианты открыты.
В любом случае это дает некоторые существенные преимущества перед некоторыми другими возможными решениями.
Во-первых, find
+ ls
включает в себя несколько вызовов - это включает только один ls
процесс, и именно поэтому он способен надежно сортировать все - что он делает по умолчанию - и такsort
также становится вспомогательным.
Любое решение , содержащее find
и sort
и ls
в значительной степени делает все работы в два раза. ls
и find
будет разрешать каждый путь и stat
каждый файл. ls
и sort
оба будут сортировать все результаты. Лучше всего вместо этого использоватьls
.
Тогда, конечно, есть date
и sed
части этого ответа. Важно отметить, что вы выполняете сложную часть и получаете сначала регулярное выражение - и только один раз - а потом вы только сокращаете один список результатов, а не говорите, получаете результаты, получаете результаты, сортируете результаты и сортируете результаты.
Это не нарушает имена файлов, содержащие символы новой строки, как, вероятно, будут другие решения. Это решение имеет свои собственные предостережения, которые я объясню далее, но они незначительны и легко обрабатываются. На мой взгляд, это самое надежное решение здесь.
В двух случаях приведенная выше команда может вызвать проблемы. Первый включает ?
глобусы в именах файлов - хотя это уже более надежное решение, чем любое другое, предлагаемое здесь, и вероятность того, что вы столкнетесь с чем-либо, сама ?
по себе достаточно мала, но существует вероятность, что эти глобусы будут разрешены. может соответствовать более одного имени файла. Пожалуйста, посмотрите это для получения дополнительной информации по этому вопросу.
Другая возможность связана с ложным срабатыванием - например, если у вас есть имя файла, фактически совпадающее со date
строкой, по которой мы ищем, grep
но которое на самом деле не было изменено ни в один из этих дней. Я не рассчитываю на то, что это проблема, но, если это так, спросите об этом, и я, вероятно, могу помочь вам сделать регулярное выражение более конкретным, чтобы справиться с этим.
ls -ls **/*(.)