как отсортировать вывод 'locate' по времени изменения файла

270
Metamorphic

Когда я использую locateкоманду, мне часто хочется, чтобы выходные данные были отсортированы в обратном хронологическом порядке, как и в случае с ls -rtc. Какой самый простой способ добиться этого?

0
Я понял, что этот ответ важен: http://superuser.com/a/251432/576570 Однако, похоже, нужно передать `--full-time` в` ls`, чтобы получить поле, которое можно сортировать (как также как `-d`, чтобы вы не перечисляли каталоги). Metamorphic 8 лет назад 1

1 ответ на вопрос

1
pwes

The easiest way to achieve this is to pipe your list of files through a sequence of commands:

locate your-search-term | xargs stat --printf '%.Y\t%n\n' | sort -n -r | cut -f 2- 

The first line locates your files — you know this already. The second line stat-s a file and prints the last modification time (epoch seconds) and the file path, for each located filename. The third line sorts the lines numerically descending. The last line cuts the modification time and the separator from each line, leaving the original path.

Спасибо, я помещу это в небольшой скрипт в моем домашнем каталоге. Я не знал о "stat" раньше. Кстати, я использую `locate -0` и` xargs -0`, чтобы имена файлов с пробелами выходили нормально. Metamorphic 8 лет назад 1
Это хорошая практика (т.е. пути, разделенные NIL), когда вы ожидаете пробелы в путях. Особенно символы новой строки здесь могут быть неприятны, они уничтожат `sort` (что можно преодолеть, добавив ключ` -z`) и `cut` (что можно преодолеть, заменив` cut` на `perl -p0e 's / ^ \ S * \ s + // '') pwes 8 лет назад 0
Я создал скрипт под названием `time-sort-files` с содержимым:` tr '\ n' '\ 0' | xargs -0 stat --printf '% .Z \ t% z \ t% n \ 0' | сортировать -zn | резать -z -f 2- | tr '\ 0' '\ n' | sed 's /: .. \ .. * \ t / \ t /' `Также печатает даты рядом с каждым файлом. Первоначальный `tr` делает это таким образом, что я могу передать обычный список файлов, разделенных символом новой строки, в` time-sort-files`. В `sort` отсутствует` -r`, потому что я на самом деле хотел хронологический порядок (я сказал «обратный» по ошибке!), Как `ls -rt`. Еще раз спасибо! Metamorphic 8 лет назад 1

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