Połączenie find
i ls
działa dobrze w przypadku
- nazwy plików bez nowych linii
- niezbyt duża ilość plików
- niezbyt długie nazwy plików
Rozwiązanie:
find . -name "my-pattern" -print0 |
xargs -r -0 ls -1 -t |
head -1
Rozbijmy to:
Dzięki temu find
możemy dopasować wszystkie interesujące pliki, takie jak:
find . -name "my-pattern" ...
następnie używając -print0
możemy bezpiecznie przekazać wszystkie nazwy plików do ls
tego:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
find
można tutaj dodać dodatkowe parametry wyszukiwania i wzorce
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -t
posortuje pliki według czasu modyfikacji (od najnowszych) i wydrukuje je jeden w wierszu. Możesz użyć -c
do sortowania według czasu utworzenia. Uwaga : to zepsuje się w przypadku nazw plików zawierających znaki nowej linii.
W końcu head -1
dostajemy pierwszy plik na posortowanej liście.
Uwaga: xargs
użyj ograniczeń systemowych do rozmiaru listy argumentów. Jeśli ten rozmiar przekroczy, xargs
zadzwoni ls
wiele razy. Spowoduje to przerwanie sortowania i prawdopodobnie również ostateczny wynik. Biegać
xargs --show-limits
aby sprawdzić limity w Twoim systemie.
Uwaga 2: użyj, find . -maxdepth 1 -name "my-pattern" -print0
jeśli nie chcesz przeszukiwać plików przez podfoldery.
Uwaga 3: Jak wskazał @starfry - -r
argument za xargs
uniemożliwia wywołanie programu ls -1 -t
, jeśli żaden plik nie został dopasowany przez rozszerzenie find
. Dziękuję za sugestię.