Saya mencari shell one-liner untuk menemukan file tertua di pohon direktori.
72
Ini berfungsi (diperbarui untuk memasukkan saran Daniel Andersson):
find -type f -printf '%T+ %p\n' | sort | head -n 1
find -type f -printf '%T+ %p\n' | sort | head -1
find
kosong karena saya memiliki nama file yang mengandung baris baru.Yang ini sedikit lebih portabel dan karena tidak bergantung pada
find
ekstensi GNU-printf
, jadi ini berfungsi pada BSD / OS X juga:Satu-satunya downside di sini adalah bahwa itu agak terbatas pada ukuran
ARG_MAX
(yang seharusnya tidak relevan untuk kebanyakan kernel yang lebih baru). Jadi, jika ada lebih darigetconf ARG_MAX
karakter yang dikembalikan (262.144 di sistem saya), itu tidak memberi Anda hasil yang benar. Ini juga tidak sesuai dengan POSIX karena-print0
danxargs -0
tidak.Beberapa solusi lebih lanjut untuk masalah ini diuraikan di sini: Bagaimana saya bisa menemukan file terbaru (terbaru, paling awal, tertua) dalam direktori? - Greg's Wiki
sumber
xargs: ls: terminated by signal 13
kesalahan sebagai efek samping. Saya menduga itu SIGPIPE. Saya tidak tahu mengapa saya tidak mendapatkan kesalahan yang sama ketika saya menyortir output sort ke head dalam solusi saya.head
perintah yang berhenti setelah membaca baris dan dengan demikian "mematahkan" pipa, saya pikir. Anda tidak mendapatkan kesalahan karenasort
tampaknya tidak mengeluh tentang hal itu, tetapils
melakukannya dalam kasus lain.xargs
perlu dipanggills
lebih dari sekali. Dalam hal ini, output yang diurutkan dari beberapa pemanggilan itu berakhir disatukan ketika mereka harus digabung.ls
melakukannya dan melihat file tertua, solusi Anda mungkin akan melampaui batas panjang baris perintah, yang menyebabkanls
dipanggil beberapa kali. Anda akan mendapatkan jawaban yang salah tetapi Anda tidak akan pernah tahu.Perintah perintah berikut dijamin untuk bekerja dengan segala jenis nama file aneh:
Menggunakan byte nol (
\0
) alih-alih karakter linefeed (\n
) memastikan output dari find masih dapat dimengerti jika salah satu nama file berisi karakter linefeed.The
-z
switch membuat kedua mengurutkan dan grep menafsirkan hanya byte null sebagai end-of-line karakter. Karena tidak ada saklar untuk head, kami menggunakangrep -m 1
(hanya satu kejadian).Perintah diperintahkan oleh waktu eksekusi (diukur pada mesin saya).
Perintah pertama akan menjadi yang paling lambat karena harus mengubah waktu setiap file menjadi format yang dapat dibaca manusia terlebih dahulu dan kemudian mengurutkan string tersebut. Perpipaan ke kucing menghindari pewarnaan hasil.
Perintah kedua sedikit lebih cepat. Sementara itu masih melakukan konversi tanggal, penyortiran numerik (
sort -n
) detik berlalu sejak zaman Unix sedikit lebih cepat. sed menghapus detik sejak zaman Unix.Perintah terakhir tidak melakukan konversi sama sekali dan harus secara signifikan lebih cepat daripada dua yang pertama. Perintah find sendiri tidak akan menampilkan mtime dari file terlama, jadi stat diperlukan.
Halaman manual terkait: find - grep - sed - sort - stat
sumber
Meskipun jawaban yang diterima dan yang lainnya di sini melakukan pekerjaan, jika Anda memiliki pohon yang sangat besar, semuanya akan mengurutkan seluruh file.
Lebih baik jika kita bisa daftar mereka dan melacak yang tertua, tanpa perlu menyortir sama sekali.
Itulah mengapa saya datang dengan solusi alternatif ini:
Saya harap ini bisa membantu, bahkan jika pertanyaannya agak lama.
Sunting 1: perubahan ini memungkinkan penguraian file dan direktori dengan spasi. Cukup cepat untuk mengeluarkannya di root
/
dan menemukan file terlama yang pernah ada.Perintah dijelaskan:
Menjalankannya:
EDIT 2: Konsep yang sama, solusi yang lebih baik digunakan
find
untuk melihat waktu akses (digunakan%T
dengan yang pertamaprintf
untuk waktu modifikasi atau%C
untuk perubahan status sebagai gantinya).EDIT 3: Perintah di bawah ini menggunakan waktu modifikasi dan juga mencetak progres tambahan saat menemukan file yang lebih lama dan lebih lama, yang berguna ketika Anda memiliki cap waktu yang salah (seperti 1970-01-01):
sumber
ls
buruk untuk scripting karena outputnya tidak dimaksudkan untuk mesin, format output bervariasi di seluruh implementasi. Seperti yang sudah Anda nyatakanfind
bagus untuk scripting tetapi mungkin juga bagus untuk menambahkan info itu sebelum menceritakanls
solusi.Silakan gunakan ls - halaman manual memberi tahu Anda cara memesan direktori.
-N 2 adalah sehingga Anda tidak mendapatkan "total" di output. Jika Anda hanya menginginkan nama file.
Dan jika Anda membutuhkan daftar dalam urutan normal (mendapatkan file terbaru)
Jauh lebih mudah daripada menggunakan find, jauh lebih cepat, dan lebih kuat - tidak perlu khawatir tentang format penamaan file. Ini seharusnya bekerja pada hampir semua sistem juga.
sumber
sumber
sort -n
.Tampaknya oleh "tertua" kebanyakan orang berasumsi bahwa Anda berarti "waktu modifikasi tertua." Itu mungkin diperbaiki, menurut interpretasi paling ketat dari "tertua", tetapi jika Anda menginginkan yang memiliki waktu akses terlama , saya akan mengubah jawaban terbaik sebagai berikut:
Perhatikan
%A+
.sumber
find ./search/dirname -type f -printf '%T+ %h/%f\n'
mencetak tanggal dan nama file dalam dua kolom.sort | head -n1
menjaga garis yang sesuai dengan file terlama.echo $2
menampilkan kolom kedua, yaitu nama file.sumber