Szukam polecenia, które zwróci pojedynczy najnowszy plik w katalogu.
Nie widzę parametru limitu do ls
...
linux
command-line
ACK
źródło
źródło
watch -n1 'ls -Art | tail -n 1'
- pokazuje ostatnie plikils
lub użyciefind
bez-print0
tego jest problematyczne przy obsłudze irytujących nazw plików. Zawsze warto wspomnieć: BashFAQ099, który daje odpowiedź POSIX na ten problemOdpowiedzi:
Niezbyt eleganckie, ale działa.
źródło
ls
dotail
, a następnie wyświetla tylko ostatnią linię. IMHO lepiej jest sortować w kolejności rosnącej i używaćhead
zamiast tego, jakchaos
sugerowano. Po wydrukowaniu nagłówka pierwszej linii kończy się, więc wysłanie następnej linii (właściwie następnego bloku) spowoduje powstanie SIGPIPE ils
również zakończy pracę.To polecenie faktycznie podaje ostatnio zmodyfikowany plik w bieżącym katalogu roboczym.
źródło
ls -tl | head -n 1
, i nie musi przepychać całej tabeli przez potok tak, jak robi to mój.ls -t *.png | head -n1
ls -Art | head -n1
jeśli chcesz specjalnie zmodyfikować plikTo jest wersja rekurencyjna (tzn. Znajduje ostatnio zaktualizowany plik w określonym katalogu lub dowolnym z jego podkatalogów)
Edycja: używaj
-f 2-
zamiast-f 2
sugerowanych przez Kevinaźródło
find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
sort -nr
, możesz użyćhead -n 1
zamiasttail -n 1
i nieznacznie poprawić wydajność. (Chociaż jeśli sortujesz rekursywne znalezisko, pobranie pierwszej lub ostatniej linii nie będzie powolną częścią.)find ./ -type f -printf "%T@ %p\n" -ls | sort -n | cut -d' ' -f 2- | tail -n 1 | xargs -r ls -lah
find $DIR -type f -exec stat -lt "%F %T" {} \+ | cut -d' ' -f6- | sort -n | tail -1
Uwaga dotycząca niezawodności:
Ponieważ znak nowego wiersza jest tak samo ważny jak każdy inny w nazwie pliku, każde rozwiązanie, które opiera się na wierszach, takich jak te oparte na
head
/tail
, jest wadliwe.W przypadku GNU
ls
inną opcją jest użycie--quoting-style=shell-always
opcji ibash
tablicy:(dodaj
-A
opcję,ls
jeśli chcesz również uwzględnić pliki ukryte).Jeśli chcesz ograniczyć się do zwykłych plików (zignoruj katalogi, kolejki linowe, urządzenia, dowiązania symboliczne, gniazda ...), będziesz musiał odwołać się do GNU
find
.Z bash 4.4 lub nowszym (dla
readarray -d
) i GNU coreutils 8.25 lub nowszym (dlacut -z
):Lub rekurencyjnie:
Najlepiej byłoby tutaj użyć
zsh
i jego kwalifikatorów glob, zamiastbash
uniknąć tego całego kłopotu:Najnowszy zwykły plik w bieżącym katalogu:
W tym ukryte:
Drugi najnowszy:
Sprawdź wiek pliku po rozwiązaniu dowiązania symbolicznego:
Rekurencyjnie:
Ponadto, z
compinit
włączonym systemem uzupełniania ( i co), Ctrl+Xmprogram uzupełniający, który rozwija się do najnowszego pliku.Więc:
Zmusiłby Cię do edycji najnowszego pliku (masz również szansę zobaczyć, który z nich zostanie przed naciśnięciem Return).
Dla drugiego najnowszego pliku.
dla najnowszego
c
pliku.dla najnowszego zwykłego pliku (nie katalogu, ani fifo / device ...) i tak dalej.
źródło
zsh
wskazówki. Czy możesz podać link do szczegółowych informacji na ten temat w dokumentach zsh?info zsh qualifiers
Używam:
ls -ABrt1 --group-directories-first | tail -n1
Daje mi tylko nazwę pliku, z wyłączeniem folderów.
źródło
ls -lAtr | tail -1
Inne rozwiązania nie obejmują plików zaczynających się od
'.'
.To polecenie będzie również zawierać
'.'
i'..'
, co może być tym, czego chcesz, ale nie musi:ls -latr | tail -1
źródło
Skrócony wariant oparty na odpowiedzi dmckee:
źródło
-1
składnia do głowy jest przestarzała już jakiś czas temu i-n 1
powinna być używana.Podoba mi się
echo *(om[1])
(zsh
składnia), ponieważ podaje tylko nazwę pliku i nie wywołuje żadnego innego polecenia.źródło
Rozwiązanie find / sort działa świetnie, dopóki liczba plików nie stanie się naprawdę duża (jak cały system plików). Zamiast tego użyj awk, aby po prostu śledzić najnowszy plik:
źródło
Osobiście wolę używać jak najmniejszej
bash
liczby niezabudowanych poleceń (aby zmniejszyć liczbę kosztownych wywołań systemowych fork i exec). Aby posortować według datyls
, należy zadzwonić. Ale używanie programuhead
nie jest naprawdę konieczne. Stosuję następującą jednowarstwową (działa tylko na systemach obsługujących rury nazwane):lub uzyskać nazwę najstarszego pliku
(Uwaga na odstęp między dwoma znakami „<”!)
Jeśli ukryte pliki są również potrzebne, można dodać -Aarg.
Mam nadzieję, że to pomoże.
źródło
używając opcji rekurencyjnej R .. możesz to uznać za ulepszenie dobrych odpowiedzi tutaj
źródło
Pokaże ostatnio zmodyfikowany element w folderze. Połącz z,
grep
aby znaleźć najnowsze wpisy ze słowami kluczowymiźródło
1
jest równoznaczne z pierwszym wierszemhead -n 1
q?Rekurencyjnie:
źródło
spróbuj tego prostego polecenia
Jeśli chcesz, aby nazwa pliku - ostatnio zmodyfikowana, ścieżka = /ab/cd/*.log
Jeśli chcesz nazwę katalogu - ostatnia modyfikacja, ścieżka = / ab / cd / * /
źródło
Zakładając, że nie przejmujesz się ukrytymi plikami zaczynającymi się od
.
Inaczej
źródło
Z wbudowanymi tylko Bash, ściśle podążającymi za BashFAQ / 003 :
źródło
Wszystkie te rozwiązania ls / tail działają doskonale w przypadku plików w formacie katalogu - ignorując podkatalogów.
Aby uwzględnić wszystkie pliki w wyszukiwaniu (rekurencyjnie), można użyć funkcji find. gioele zasugerował sortowanie sformatowanego wyniku wyszukiwania. Uważaj jednak na białe spacje (jego sugestia nie działa w przypadku białych znaków).
Powinno to działać ze wszystkimi nazwami plików:
Sortuje według czasu, zobacz man find:
Więc po prostu wymienić
%T
się%C
na sortowanie wg ctime.źródło
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Lub alternatywnie, zachowaj wszystko oprócz pierwszego pola:find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
Znajdowanie najbardziej aktualnego pliku w każdym katalogu według wzorca, np. Podkatalogów katalogu roboczego, które mają nazwę kończącą się na „tmp” (bez rozróżniania wielkości liter):
źródło
źródło
Jeśli chcesz pobrać najnowszy zmieniony plik, zawierający również podkatalogi, możesz to zrobić za pomocą tego małego onelinera:
Jeśli chcesz zrobić to samo nie dla zmienionych plików, ale dla plików, do których uzyskano dostęp, po prostu musisz zmienić
% R parametrów z stat polecenia do X% . Twoje polecenie dla ostatnio otwieranych plików wygląda następująco:
W przypadku obu poleceń możesz także zmienić parametr var = "1" , jeśli chcesz wyświetlić więcej niż jeden plik.
źródło
Też musiałem to zrobić i znalazłem te polecenia. te działają dla mnie:
Jeśli chcesz mieć ostatni plik według daty utworzenia w folderze (czas dostępu):
A jeśli chcesz ostatni plik, który ma zmiany w swojej zawartości (czas modyfikacji):
źródło