Комбинация findи lsподходит для
- имена файлов без символов новой строки
- не очень большое количество файлов
- не очень длинные имена файлов
Решение:
find . -name "my-pattern" -print0 |
xargs -r -0 ls -1 -t |
head -1
Давайте разберемся:
С помощью findмы можем сопоставить все интересные файлы следующим образом:
find . -name "my-pattern" ...
затем с помощью -print0мы можем безопасно передать все имена файлов lsследующим образом:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
findздесь можно добавить дополнительные параметры поиска и шаблоны
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -tотсортирует файлы по времени модификации (сначала самые новые) и распечатает их по одному. Вы можете использовать -cдля сортировки по времени создания. Примечание : это нарушит имена файлов, содержащие символы новой строки.
Наконец, head -1мы получаем первый файл в отсортированном списке.
Примечание: xargs используйте системные ограничения на размер списка аргументов. Если этот размер превышает, xargsвызовет lsнесколько раз. Это нарушит сортировку и, возможно, также окончательный результат. Бегать
xargs --show-limits
чтобы проверить лимиты в вашей системе.
Примечание 2: используйте, find . -maxdepth 1 -name "my-pattern" -print0если вы не хотите искать файлы во вложенных папках.
Примечание 3: как указано в @starfry - -rаргумент для xargsпредотвращает вызов ls -1 -t, если файлы не были сопоставлены find. Спасибо за предложение.