Как отсортировать результаты оператора Find по дате?

Вы можете просто проверить любой адрес с помощью команды ip route get (см. man ip-route ). Например,

$ ip route get 192.168.1.99
192.168.1.99 dev eth0  src 192.168.1.0 
5
12.11.2017, 18:48
2 ответа

get file names only... sorted by modification day

find+sort+cutподход:

find. -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort | cut -d' ' -f2

  • %T@-Время последней модификации файла, где @равно секунд с Jan. 1, 1970, 00:00 GMT,с дробной частью

  • %f-Имя файла с удаленными начальными каталогами (только последний элемент)


Для сортировки по убыванию:

find. -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort -k1,1r | cut -d' ' -f2
8
27.01.2020, 20:33

Ваш метод можно адаптировать для работы в простых случаях. Основная проблема, с которой вы сталкиваетесь, заключается в том, что вы передаете ввод в ls, но lsне принимает никаких входных данных. lsпринимает аргументы командной строки. Таким образом, вам нужно передать вывод findв качестве аргументов в lsс подстановкой команд. Кроме того, в случае совпадения каталога, передайте от -dдо ls, чтобы отобразить сам каталог, а не его содержимое.

OLDDATA=$(ls -td $(find. -regex ".*/[0-9.]+"))

Только в простых случаях, т.к. есть два ограничения:

  1. Это зависит от подстановки команд без кавычек (, а также от использования $OLDDATAпосле ). Поэтому предполагается, что имена файлов не содержат специальных символов (, пробелов или подстановочных знаков \[*?).
  2. Некоторые версии lsмогут искажать символы, которые не печатаются в текущей локали.
  3. Если общая длина имен файлов слишком велика, вы получите сообщение об ошибке. (Обратите внимание, что find … -execи xargsздесь не помогут, так как lsнужно запустить один раз, чтобы получить правильный порядок имен файлов. Все, что они могли сделать, это скрыть ошибки и вывести некорректно отсортированный вывод, а в случае xargsисказить еще несколько символов.)

Надежный и простой способ сделать это — использовать zsh . Он имеет возможность сортировать совпадения с подстановочными знаками благодаря квалификаторам glob .

setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
  • Поскольку это не вызывает никакую другую программу, нет ограничений по длине, кроме доступной памяти, и нет риска искажения имени файла в любой момент.
  • Результатом является список строк, (каждая строка является именем файла ), а не строкой, поэтому она входит в переменную массива.
  • **/рекурсивно обходит подкаталоги, избегая использования find.
  • ##означает «один или несколько из предыдущих» в синтаксисе расширенного glob zsh, он аналогичен +в синтаксисе (расширенного )регулярного выражения.
  • (om)— это квалификатор glob для сортировки файлов по времени модификации, например ls -t.

Общеизвестно, что не существует простого способа сделать это надежно с помощью инструментов POSIX или даже с помощью инструментов GNU и ksh.

5
27.01.2020, 20:33

Теги

Похожие вопросы