Yanıtlar:
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "
Büyük bir ağaç için, sort
her şeyi hafızada tutmak zor olabilir .
%T@
bir unix zaman damgası gibi değişiklik süresini verir, sort -n
sayısal olarak sıralar tail -1
, son satırı (en yüksek zaman damgası) alır, cut -f2 -d" "
ilk alanı (zaman damgası) çıktıdan keser.
Düzenleme:-printf
Muhtemelen sadece GNU gibi , ajreals kullanımı stat -c
da. Aynı şeyi BSD'de yapmak mümkün olsa da, biçimlendirme seçenekleri farklıdır ( -f "%m %N"
görünecektir)
Ve çoğul kısmını özledim; Daha sonra isterseniz son dosyayı, sadece kuyruk argümanı yükseltmek.
sort -rn | head -3
bunun yerine kullanımı değiştirebilirsiniz sort -n | tail -3
. Bir sürüm dosyaları en eskiden en yeniye verirken diğeri en yeniden en eskiye doğru verir.
sort
geçici dosyalar (in /tmp
) oluşturacaktır , bu yüzden bunun bir endişe olduğunu düşünmüyorum.
-printf '%T@ %Tb %Td %TY %p\n'
size bir tarih damgası verir (gerekirse ls
)
find . -type f -printf '%TF %TT %p\n' | sort | tail -1
Takip etmek @ plundra cevabı , burada BSD ve OS X sürümü:
find . -type f -print0 | xargs -0 stat -f "%m %N" |
sort -rn | head -1 | cut -f2- -d" "
find
destekliyor mu? Çünkü bu aynı şeyi yapar (parametre olarak birden fazla dosyayı geçirerek), boru olmadan . +
\;
-print0 | xargs -0
head -1
içinhead -5
Sonuçları sıralamak ve yalnızca son değiştirilenleri tutmak yerine, yalnızca en büyük değişiklik süresine sahip olanı (unix zamanında) yazdırmak için awk kullanabilirsiniz:
find . -type f -printf "%T@\0%p\0" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\0'
Dosya sayısı yeterince büyükse, bu sorununuzu çözmenin daha hızlı bir yolu olmalıdır.
Teorik olarak, bir dosya adı (boşluk ve satırsonu dahil) herhangi bir karakter içerebilir, çünkü NUL karakteri (yani '\ 0') kullandım.
Sisteminizde böyle patolojik dosya adlarınız yoksa, yeni satır karakterini de kullanabilirsiniz:
find . -type f -printf "%T@\n%p\n" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\n'
Buna ek olarak, bu mawk da çalışır.
mawk
Debian standart alternatifi ile çalışmaz .
Solaris 10 altında en son değiştirilen dosyayı bulmakta sorun yaşadım find
. printf
Seçenek yok ve stat
mevcut değil. Benim için uygun olan aşağıdaki çözümü keşfettim:
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7 }' | sort | tail -1
Dosya adını da göstermek için
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7," ",$9 }' | sort | tail -1
açıklama
find . -type f
tüm dosyaları bulur ve listelersed 's/.*/"&"/'
boşlukları işlemek için yol adını tırnak işaretleri içine alırxargs ls -E
kote yolunu gönderir ls
, -E
seçenek tam zaman damgası (biçim emin olur yıl-ay-gün saat dakika-saniye-nanosaniye ) döndürülürawk '{ print $6," ",$7 }'
sadece tarih ve saati ayıklarawk '{ print $6," ",$7," ",$9 }'
tarih, saat ve dosya adını ayıklarsort
dosyaları tarihe göre sıralanmış olarak döndürürtail -1
yalnızca son değiştirilen dosyayı döndürürBu, alt dizinlerle bile iyi çalışıyor gibi görünüyor:
find . -type f | xargs ls -ltr | tail -n 1
Çok fazla dosya olması durumunda, bulmayı daraltın.
-l
Seçeneği ls
gereksiz görünüyor. Sadece -tr
yeterli görünüyor.
find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
İnsan tarafından okunabilir zaman damgası içeren en son dosyayı gösterir:
find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n1
Sonuç şuna benzer:
2015-10-06 11:30: +0200 ./foo/bar.txt
Daha fazla dosya göstermek için daha -n1
yüksek bir sayıyla değiştirin
Her zaman benzer bir şey ve en son değiştirilen dosyaların top-k listesini kullanıyorum. Büyük dizin ağaçları için, sıralamayı önlemek çok daha hızlı olabilir . Yalnızca en son değiştirilen ilk 1 dosya için:
find . -type f -printf '%T@ %p\n' | perl -ne '@a=split(/\s+/, $_, 2); ($t,$f)=@a if $a[0]>$t; print $f if eof()'
1.7 milyon dosya içeren bir dizinde, 3.4s'de en sonuncuyu alıyorum, sıralama kullanarak 25.5s çözümüne karşı 7.5x hız.
lastfile
) ve sonra sonuçla istediğiniz gibi yapabilirsiniz ls -l $(lastfile .)
, ya da open $(lastfile .)
(Mac'te), vb.
Ubuntu 13'te, aşağıdakileri yapar, belki biraz daha hızlıdır, çünkü sıralamayı tersine çevirir ve 'kuyruk' yerine 'kafa' kullanır ve işi azaltır. Bir ağaçtaki en yeni 11 dosyayı göstermek için:
bulmak. tipi f -printf '% T @% p \ n' | sıralama -n -r | kafa -11 | kes -f2- -d "" | sed -e 's, ^. / ,,' | xargs ls -U -l
Bu, yeniden sıralama yapmadan tam bir ls listesi verir ve can sıkıcı './' 'bul' her dosya adını koyar.
Veya bash işlevi olarak:
treecent () {
local numl
if [[ 0 -eq $# ]] ; then
numl=11 # Or whatever default you want.
else
numl=$1
fi
find . -type f -printf '%T@ %p\n' | sort -n -r | head -${numl} | cut -f2- -d" " | sed -e 's,^\./,,' | xargs ls -U -l
}
Yine de, çalışmaların çoğu plundra'nın orijinal çözümü tarafından yapıldı. Teşekkürler plundra.
Aynı sorunla karşılaştım. En son dosyayı özyinelemeli bulmam gerekiyor. bulmak için yaklaşık 50 dakika sürdü.
İşte daha hızlı yapmak için küçük bir komut dosyası:
#!/bin/sh
CURRENT_DIR='.'
zob () {
FILE=$(ls -Art1 ${CURRENT_DIR} | tail -n 1)
if [ ! -f ${FILE} ]; then
CURRENT_DIR="${CURRENT_DIR}/${FILE}"
zob
fi
echo $FILE
exit
}
zob
Bir dizinin en son değiştirilen öğesini alan özyinelemeli bir işlevdir. Bu öğe bir dizinse, işlev özyinelemeli olarak adlandırılır ve bu dizinde vb.
Aşağıdaki kısa ve daha yorumlanabilir çıktı ile buluyorum:
find . -type f -printf '%TF %TT %p\n' | sort | tail -1
Standartlaştırılmış ISO formatının sabit zamanları göz önüne alındığında, sözlükbilimsel sıralama iyidir ve -n
seçeneğe .
Zaman damgalarını tekrar kaldırmak istiyorsanız şunları kullanabilirsiniz:
find . -type f -printf '%TFT%TT %p\n' | sort | tail -1 | cut -f2- -d' '
stat
Her dosyada ayrı ayrı çalışan yavaşlamak istiyorsanız, xargs
işleri biraz hızlandırmak için kullanabilirsiniz :
find . -type f -print0 | xargs -0 stat -f "%m %N" | sort -n | tail -1 | cut -f2- -d" "
Bu, geçerli dizindeki tüm dizinlerin değiştirilme süresini her dizindeki en yeni dosyaya yinelemeli olarak değiştirir:
for dir in */; do find $dir -type f -printf '%T@ "%p"\n' | sort -n | tail -1 | cut -f2- -d" " | xargs -I {} touch -r {} $dir; done
Bu basit klibi de çalışacak:
ls -1t | head -1
-1 değerini listelemek istediğiniz dosya sayısına değiştirebilirsiniz
Yukarıdaki komutu kullanışlı buldum, ancak benim durumum için dosyanın tarihini ve saatini görmem gerekiyordu, ayrıca adlarda boşluk olan birkaç dosyayla ilgili bir sorunum vardı. İşte benim çalışma çözümüm.
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | sed 's/.*/"&"/' | xargs ls -l
$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10
Dosya adlarındaki boşlukları iyi işler - bunların kullanılması gerekmez!
2017.01.25 18h23 Wed ./indenting/Shifting blocks visually.mht
2016.12.11 12h33 Sun ./tabs/Converting tabs to spaces.mht
2016.12.02 01h46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016.11.09 17h05 Wed ./Word count - Vim Tips Wiki.mht
find
Bağlantıyı takiben daha fazla bolluk.
/ Target_directory ve tüm alt dizinlerindeki son 60 dakika içinde değiştirilmiş dosyaları aramak için:
$ find /target_directory -type f -mmin -60
En son değiştirilen dosyaları, güncelleme süresinin ters sırasına göre sıralanmış olarak bulmak için (yani, en son güncellenen dosyalar önce):
$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
Bunu tercih ederim, daha kısa:
find . -type f -print0|xargs -0 ls -drt|tail -n 1
Bu soru için bir pypi / github paketi yazdım çünkü bir çözüme de ihtiyacım vardı.
https://github.com/bucknerns/logtail
Yüklemek:
pip install logtail
Kullanım: kuyrukları değiştirilen dosyaları
logtail <log dir> [<glob match: default=*.log>]
Kullanım2: En son değiştirilen dosyayı düzenleyicide açar
editlatest <log dir> [<glob match: default=*.log>]