Mencari perintah yang akan mengembalikan satu file terbaru dalam direktori.
Tidak melihat parameter batas ke ls
...
linux
command-line
ack
sumber
sumber
watch -n1 'ls -Art | tail -n 1'
- menunjukkan file terakhirls
atau penggunaanfind
tanpa-print0
yang bermasalah untuk menangani nama file yang mengganggu. Selalu berguna untuk menyebutkan: BashFAQ099 yang memberikan jawaban POSIX untuk masalah iniJawaban:
Tidak terlalu elegan, tetapi berhasil.
sumber
ls
ketail
, kemudian hanya mencetak garis LAST. IMHO lebih baik untuk mengurutkan dalam urutan naik dan gunakanhead
sebagai gantinya, seperti yangchaos
disarankan. Setelah mencetak kepala baris pertama berhenti, jadi mengirim baris berikutnya (sebenarnya blok berikutnya) akan naik SIGPIPE danls
akan berhenti juga.Perintah ini sebenarnya memberikan file yang dimodifikasi terbaru di direktori kerja saat ini.
sumber
ls -tl | head -n 1
, dan itu tidak harus mendorong seluruh tabel melalui pipa seperti yang dilakukan tambang.ls -t *.png | head -n1
ls -Art | head -n1
jika Anda secara spesifik menginginkan file yang dimodifikasi terbaruIni adalah versi rekursif (yaitu menemukan file yang paling baru diperbarui di direktori tertentu atau salah satu subdirektori)
Sunting: gunakan
-f 2-
alih-alih-f 2
seperti yang disarankan oleh Kevinsumber
find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
sort -nr
, Anda dapat menggunakanhead -n 1
alih-alihtail -n 1
dan sedikit meningkatkan efisiensi. (Meskipun jika Anda mengurutkan penemuan rekursif, mendapatkan baris pertama atau terakhir tidak akan menjadi bagian yang lambat.)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
Catatan tentang keandalan:
Karena karakter baris baru sama validnya dengan nama file, solusi apa pun yang bergantung pada baris seperti yang berbasis
head
/tail
cacat.Dengan GNU
ls
, opsi lain adalah menggunakan--quoting-style=shell-always
opsi danbash
array:(tambahkan
-A
opsils
jika Anda juga ingin mempertimbangkan file tersembunyi).Jika Anda ingin membatasi ke file biasa (abaikan direktori, fifos, perangkat, symlink, soket ...), Anda harus beralih ke GNU
find
.Dengan bash 4.4 atau yang lebih baru (untuk
readarray -d
) dan GNU coreutils 8.25 atau yang lebih baru (untukcut -z
):Atau secara rekursif:
Yang terbaik di sini adalah menggunakan
zsh
dan kualifikasi globalnya alih-alihbash
menghindari semua kerumitan ini:File reguler terbaru di direktori saat ini:
Termasuk yang tersembunyi:
Terbaru kedua:
Periksa usia file setelah resolusi symlink:
Secara rekursif:
Juga, dengan sistem penyelesaian (
compinit
dan co) diaktifkan, Ctrl+Xmmenjadi pelengkap yang memperluas ke file terbaru.Begitu:
Akan membuat Anda mengedit file terbaru (Anda juga mendapatkan kesempatan untuk melihatnya sebelum Anda menekan Return).
Untuk file terbaru kedua.
untuk
c
file terbaru .untuk file reguler terbaru (bukan direktori, atau fifo / perangkat ...), dan sebagainya.
sumber
zsh
tipsnya. Bisakah Anda memberikan tautan ke detail lebih lanjut tentang ini di dokumen zsh?info zsh qualifiers
Saya menggunakan:
ls -ABrt1 --group-directories-first | tail -n1
Ini memberi saya hanya nama file, tidak termasuk folder.
sumber
ls -lAtr | tail -1
Solusi lain tidak termasuk file yang dimulai dengan
'.'
.Perintah ini juga akan mencakup
'.'
dan'..'
, yang mungkin atau tidak sesuai dengan yang Anda inginkan:ls -latr | tail -1
sumber
Varian singkat berdasarkan jawaban dmckee:
sumber
-1
sintaks untuk kepala telah ditinggalkan beberapa waktu yang lalu, dan-n 1
harus digunakan.Saya suka
echo *(om[1])
(zsh
sintaks) karena hanya memberikan nama file dan tidak meminta perintah lain.sumber
Solusi find / sort berfungsi dengan baik hingga jumlah file menjadi sangat besar (seperti seluruh sistem file). Gunakan awk sebagai gantinya untuk hanya melacak file terbaru:
sumber
Saya pribadi lebih suka menggunakan beberapa
bash
perintah tidak built-in yang saya bisa (untuk mengurangi jumlah garpu dan syscalls exec mahal). Untuk mengurutkan berdasarkan tanggalls
perlu dipanggil. Tetapi penggunaanhead
tidak benar-benar diperlukan. Saya menggunakan satu-liner berikut (hanya bekerja pada sistem yang mendukung pipa nama):atau untuk mendapatkan nama file terlama
(Pikirkan ruang antara dua '<' tanda!)
Jika file tersembunyi juga diperlukan -A arg dapat ditambahkan.
Saya harap ini bisa membantu.
sumber
menggunakan opsi R rekursif .. Anda dapat menganggap ini sebagai peningkatan untuk jawaban yang baik di sini
sumber
Akan menampilkan item yang dimodifikasi terakhir di folder. Pasangkan dengan
grep
untuk menemukan entri terbaru dengan kata kuncisumber
1
adalah untuk baris pertama equiv untukhead -n 1
apa q?Secara rekursif:
sumber
coba perintah sederhana ini
Jika Anda ingin nama file - terakhir dimodifikasi, path = /ab/cd/*.log
Jika Anda ingin nama direktori - terakhir diubah, path = / ab / cd / * /
sumber
Menganggap Anda tidak peduli dengan file tersembunyi yang dimulai dengan a
.
Jika tidak
sumber
Dengan hanya Bash bawaan, mengikuti BashFAQ / 003 :
sumber
Semua ls orang / solusi ekor bekerja baik-baik saja untuk file dalam sebuah direktori - mengabaikan subdirektori.
Untuk memasukkan semua file dalam pencarian Anda (secara rekursif), find dapat digunakan. gioele menyarankan untuk menyortir hasil pencarian yang diformat. Tapi hati-hati dengan spasi putih (sarannya tidak bekerja dengan spasi putih).
Ini harus bekerja dengan semua nama file:
Ini semacam jam, lihat pria menemukan:
Jadi ganti saja
%T
dengan%C
mengurutkan berdasarkan waktu.sumber
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Atau sebagai alternatif, simpan semua kecuali bidang pertama:find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
Menemukan file terbaru di setiap direktori sesuai dengan suatu pola, misalnya sub direktori direktori kerja yang memiliki nama yang diakhiri dengan "tmp" (tidak sensitif huruf besar-kecil):
sumber
sumber
Jika Anda ingin mendapatkan file yang diubah terbaru juga termasuk subdirektori, Anda dapat melakukannya dengan oneliner kecil ini:
Jika Anda ingin melakukan hal yang sama bukan untuk file yang diubah, tetapi untuk file yang diakses Anda harus mengubah
% Y parameter dari Stat perintah untuk % X . Dan perintah Anda untuk sebagian besar file yang diakses terakhir terlihat seperti ini:
Untuk kedua perintah, Anda juga dapat mengubah parameter var = "1" jika Anda ingin membuat daftar lebih dari satu file.
sumber
Saya perlu melakukannya juga, dan saya menemukan perintah-perintah ini. ini bekerja untuk saya:
Jika Anda ingin file terakhir berdasarkan tanggal pembuatannya di folder (waktu akses):
Dan jika Anda ingin file terakhir yang memiliki perubahan dalam kontennya (ubah waktu):
sumber