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