Поєднання 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. Дякую за пропозицію.