Połączenie findi lsdział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 findmożemy dopasować wszystkie interesujące pliki, takie jak:
find . -name "my-pattern" ...
następnie używając -print0możemy bezpiecznie przekazać wszystkie nazwy plików do lstego:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
findmożna tutaj dodać dodatkowe parametry wyszukiwania i wzorce
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -tposortuje pliki według czasu modyfikacji (od najnowszych) i wydrukuje je jeden w wierszu. Możesz użyć -cdo sortowania według czasu utworzenia. Uwaga : to zepsuje się w przypadku nazw plików zawierających znaki nowej linii.
W końcu head -1dostajemy pierwszy plik na posortowanej liście.
Uwaga: xargs użyj ograniczeń systemowych do rozmiaru listy argumentów. Jeśli ten rozmiar przekroczy, xargszadzwoni lswiele 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" -print0jeśli nie chcesz przeszukiwać plików przez podfoldery.
Uwaga 3: Jak wskazał @starfry - -rargument za xargsuniemożliwia wywołanie programu ls -1 -t, jeśli żaden plik nie został dopasowany przez rozszerzenie find. Dziękuję za sugestię.