Bir dizindeki en son tek dosyayı döndürecek bir komut arıyorsunuz.
İçin bir limit parametresi görmüyor ls
...
ls
veya kullanır . : Söz her zaman yararlı BashFAQ099 bir POSIX bu soruna cevap verirfind
-print0
Bir dizindeki en son tek dosyayı döndürecek bir komut arıyorsunuz.
İçin bir limit parametresi görmüyor ls
...
ls
veya kullanır . : Söz her zaman yararlı BashFAQ099 bir POSIX bu soruna cevap verirfind
-print0
Yanıtlar:
ls -Art | tail -n 1
Çok zarif değil, ama işe yarıyor.
ls
için tail
, daha sonra sadece SON çizgi yazdırır. IMHO artan düzende sıralamak ve head
bunun yerine chaos
önerildiği gibi kullanmak daha iyidir . İlk satır başlığı yazdırıldıktan sonra bir sonraki satırın (aslında sonraki blok) gönderilmesi SIGPIPE'yi yükseltir ve ls
aynı zamanda kapanır .
ls -t | head -n1
Bu komut aslında geçerli çalışma dizinindeki en son değiştirilen dosyayı verir.
ls -tl | head -n 1
ve tüm tabloyu benimki gibi borudan itmek zorunda değildir.
ls -t *.png | head -n1
ls -Art | head -n1
özellikle en son değiştirilmiş dosyayı istiyorsanız
Bu özyinelemeli bir sürümdür (yani en son güncellenen dosyayı belirli bir dizinde veya alt dizinlerinden herhangi birinde bulur)
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Düzenleme: Kullanım -f 2-
yerine -f 2
Kevin önerdiği gibi
find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
sort -nr
kullanabileceğiniz head -n 1
yerine tail -n 1
ve biraz verimliliğini artırmak. (Yinelemeli bir
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
Güvenilirlik hakkında bir not:
Yeni satır karakteri bir dosya adında olduğu gibi geçerli olduğundan , / based gibi satırlara dayanan herhangi bir çözüm kusurludur.head
tail
GNU ls
ile başka bir seçenek, --quoting-style=shell-always
seçeneği ve bir bash
diziyi kullanmaktır:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
( gizli dosyaları da dikkate almak istiyorsanız -A
seçeneğini ekleyin ls
).
Normal dosyalarla sınırlamak istiyorsanız (dizinleri, fifo'ları, cihazları, sembolik bağlantıları, soketleri göz ardı edin), GNU'ya başvurmanız gerekir find
.
Bash 4.4 veya daha yeni (for readarray -d
) ve GNU coreutils 8.25 veya daha yeni (for cut -z
) ile:
readarray -t -d '' files < <(
LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn | cut -zd/ -f2)
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
Veya özyineli olarak:
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
Buradaki en iyisi zsh
, bash
tüm bu güçlüklerden kaçınmak yerine kullanmak ve glob elemeleri olacaktır:
Geçerli dizindeki en yeni normal dosya:
printf '%s\n' *(.om[1])
Gizli olanlar dahil:
printf '%s\n' *(D.om[1])
En yeni ikinci:
printf '%s\n' *(.om[2])
Symlink çözümlemesinden sonra dosya yaşını kontrol edin:
printf '%s\n' *(-.om[1])
Tekrarlı:
printf '%s\n' **/*(.om[1])
Ayrıca, tamamlama sistemi ( compinit
ve birlikte) etkinleştirildiğinde, Ctrl+Xmen yeni dosyaya genişleyen bir tamamlayıcı olur.
Yani:
vi Ctrl+Xm
En yeni dosyayı düzenlemenizi sağlar (ayrıca basmadan önce hangisini görme şansınız olur Return).
vi Alt+2Ctrl+Xm
En yeni ikinci dosya için.
vi * .cCtrl+Xm
en yeni c
dosya için.
vi * (.)Ctrl+Xm
en yeni normal dosya için (dizin değil, fifo / cihaz ...) vb.
zsh
İpuçları için teşekkürler . Bu konuda daha fazla ayrıntı için zsh dokümanlarında bir bağlantı sağlayabilir misiniz?
info zsh qualifiers
Kullanırım:
ls -ABrt1 --group-directories-first | tail -n1
Klasörler hariç bana sadece dosya adını veriyor.
ls -lAtr | tail -1
Diğer çözümler, ile başlayan dosyaları içermez '.'
.
Bu komut ayrıca aşağıdakileri içerecek '.'
ve '..'
olmayabilecek ve içermeyecektir :
ls -latr | tail -1
Dmckee'nin cevabına göre kısa süreli varyant:
ls -t | head -1
-1
sözdizimi bir süre önce kaldırılmıştır ve -n 1
kullanılmalıdır.
Sevdiğim echo *(om[1])
( zsh
bu sadece dosya adını verir ve diğer komuta çağırmak değil yaptığı gibi sözdizimi).
Bul / sırala çözümü, dosya sayısı gerçekten büyüyene kadar (tüm dosya sistemi gibi) harika çalışır. En son dosyayı takip etmek için awk komutunu kullanın:
find $DIR -type f -printf "%T@ %p\n" |
awk '
BEGIN { recent = 0; file = "" }
{
if ($1 > recent)
{
recent = $1;
file = $0;
}
}
END { print file; }' |
sed 's/^[0-9]*\.[0-9]* //'
Kişisel olarak mümkün olduğunca az sayıda yerleşik olmayan bash
komut kullanmayı tercih ediyorum (pahalı çatal ve exec sistem çağrılarının sayısını azaltmak için). Tarihe göre sıralamak için aranması ls
gerekiyor. Ancak, head
kullanımı gerçekten gerekli değildir. Aşağıdaki tek astarı kullanıyorum (yalnızca ad borularını destekleyen sistemlerde çalışır):
read newest < <(ls -t *.log)
veya en eski dosyanın adını almak için
read oldest < <(ls -rt *.log)
(İki '<' işareti arasındaki boşluğa dikkat edin!)
Gizli dosyalar da gerekiyorsa -bir arg eklenebilir.
Umarım bu yardımcı olabilir.
ls -t -1 | sed '1q'
Klasördeki son değiştirilen öğeyi gösterir. grep
Anahtar kelimelerle en son girişleri bulmak için ile eşleştirin
ls -t -1 | grep foo | sed '1q'
1
ilk satır head -n 1
için q nedir?
bu basit komutu dene
ls -ltq <path> | head -n 1
Dosya adını istiyorsanız - son değiştirilme tarihi: path = /ab/cd/*.log
Dizin adı - son değiştirilme tarihi istiyorsanız, path = / ab / cd / * /
Bir ile başlayan gizli dosyaları umursamadığınızı varsayarsak .
ls -rt | tail -n 1
Aksi takdirde
ls -Art | tail -n 1
BashFAQ / 003'ü yakından takip eden sadece Bash yapıları ile :
shopt -s nullglob
for f in * .*; do
[[ -d $f ]] && continue
[[ $f -nt $latest ]] && latest=$f
done
printf '%s\n' "$latest"
Tüm bu ls / tail çözümleri, bir dizindeki - alt dizinleri yok sayar.
Aramanıza tüm dosyaları dahil etmek için (özyinelemeli olarak) find kullanılabilir. gioele, biçimlendirilmiş bulma çıktısının sıralanmasını önerdi. Ancak beyaz boşluklara dikkat edin (önerisi beyaz boşluklarla çalışmaz).
Bu, tüm dosya adlarıyla çalışmalıdır:
find $DIR -type f -printf "%T@ %p\n" | sort -n | sed -r 's/^[0-9.]+\s+//' | tail -n 1 | xargs -I{} ls -l "{}"
Bu zamana göre sıralıyor, bkz.
%Ak File's last access time in the format specified by k, which is either `@' or a directive for the C `strftime' function. The possible values for k are listed below; some of them might not be available on all systems, due to differences in `strftime' between systems.
@ seconds since Jan. 1, 1970, 00:00 GMT, with fractional part.
%Ck File's last status change time in the format specified by k, which is the same as for %A.
%Tk File's last modification time in the format specified by k, which is the same as for %A.
Yani sadece ctime %T
ile %C
sıralamak için ile değiştirin .
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Veya alternatif olarak, ilk alan hariç tümünü saklayın: find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
ls -Frt | grep "[^/]$" | tail -n 1
Herhangi bir alt dizin de dahil olmak üzere en son değiştirilen dosyayı almak istiyorsanız, bu küçük oneliner ile yapabilirsiniz:
find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
Aynı şeyi değiştirilen dosyalar için değil, erişilen dosyalar için basitçe
Stat komutundan % X parametresine % Y parametresi . Ve en son erişilen dosyalar için komutunuz şöyle görünür:
find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
Her iki komut için de birden fazla dosya listelemek istiyorsanız var = "1" parametresini değiştirebilirsiniz .
Ben de yapmam gerekiyordu ve bu komutları buldum. bunlar benim için çalışıyor:
Son dosyayı klasörde oluşturulma tarihine göre istiyorsanız (erişim zamanı):
ls -Aru | tail -n 1
Ve içeriğinde değişiklik olan son dosyayı istiyorsanız (zamanı değiştir):
ls -Art | tail -n 1
watch -n1 'ls -Art | tail -n 1'
- en son dosyaları gösterir