Bagaimana saya bisa melakukan yang sederhana find
yang akan memesan hasil dengan paling baru dimodifikasi?
Berikut ini adalah saat ini find
saya menggunakan (saya melakukan shell escape di PHP, jadi itulah alasan untuk variabel):
find '$dir' -name '$str'\* -print | head -10
Bagaimana saya bisa memesan pesanan ini dengan yang paling baru dimodifikasi? (Catatan Saya tidak ingin ini untuk mengurutkan 'setelah' pencarian, tetapi mencari hasil berdasarkan apa yang baru-baru ini dimodifikasi.)
Jawaban:
Gunakan ini:
printf
argumen dariman find
:%Tk
: Waktu modifikasi terakhir file dalam format yang ditentukan olehk
.@
: detik sejak 1 Januari 1970, 00:00 GMT, dengan bagian pecahan.c
: tanggal dan waktu lokal (Sab 04 12:02:33 EST 1989).%p
: Nama file.sumber
~/.zshrc
:fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; }
Secara rekursif menemukan semua file yang berisi pola argumen pertama diteruskan ke perintah (fr <pattern>
) dan mengurutkannya dengan yang terbaru terakhir.find -L ...
ssed
untuk menyingkirkan bagian pecahan detik dan masih menggunakan ISO8601 seperti yang ditunjukkan @PeterMortensen:find . -type f -printf "%TY-%Tm-%TdT%TT %p\n" | sort -r | ssed -R 's/^([^.]+)\.\d+ (.*)$/\1 \2/'
Metode termudah adalah menggunakan zsh, terima kasih kepada kualifikasi globalnya .
Jika Anda menemukan GNU, buatlah untuk mencetak waktu modifikasi file dan urutkan berdasarkan itu.
Jika Anda memiliki GNU yang menemukan tetapi bukan utilitas GNU lainnya, gunakan baris baru sebagai pemisah, bukan nol; Anda akan kehilangan dukungan untuk nama file yang mengandung baris baru.
Jika Anda memiliki Perl (di sini saya akan menganggap tidak ada baris baru dalam nama file):
Jika Anda memiliki Python (dengan asumsi tidak ada baris baru dalam nama file):
Mungkin ada cara untuk melakukan hal yang sama di PHP, tapi saya tidak tahu.
Jika Anda ingin bekerja hanya dengan alat POSIX, itu agak lebih rumit; lihat Cara membuat daftar file yang diurutkan berdasarkan tanggal modifikasi secara rekursif (tidak ada perintah stat tersedia!) (memulai kembali 10 yang pertama adalah bagian yang mudah).
sumber
find
versi menunjukkan file tertua, dan Anda perlu menambahkan-r
opsisort
.Anda tidak perlu PHP atau Python, cukup ls :
Jika perintah * keluar dengan status kegagalan (mis. Daftar argumen terlalu panjang ), maka Anda dapat beralih dengan find. Diparafrasekan dari: Panjang maksimum argumen untuk proses baru
find . -print0|xargs -0 command
(mengoptimalkan kecepatan, jika find tidak mengimplementasikan "-exec +" tetapi tahu "-print0")find . -print|xargs command
(jika tidak ada spasi di argumen)Jika bagian utama dari argumen terdiri dari jalur panjang, absolut atau relatif, maka cobalah untuk memindahkan tindakan Anda ke direktori:
cd /directory/with/long/path; command *
Dan perbaikan cepat lainnya mungkin untuk mencocokkan lebih sedikit argumen:command [a-e]*; command [f-m]*; ...
sumber
Anda hanya perlu ls
Anda dapat melakukan
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
seperti yang disebutkan di atas,atau
sumber
xargs
panggilanls
beberapa kali, jenisnya akan rusak.+;
pada akhirnya? Tampaknya memberikan hasil yang sama tanpa;
tetapi tidak berfungsi tanpa+
?Memperluas jawaban user195696 :
Untuk setiap file, ini output pertama timestamp numerik (untuk menyortir oleh, diikuti oleh tabulasi
\t
), maka timestamp terbaca-manusia, maka filesize (sayangnyafind
's-printf
tidak bisa melakukan di mebibyte, hanya kibibyte), maka nama file dengan relatif jalan.Kemudian
sort -n
urutkan berdasarkan bidang angka pertama.Lalu
cut
singkirkan bidang angka pertama yang tidak menarik bagi pengguna. (Mencetak bidang kedua ke depan.) Pemisah bidang default adalah\t
atau tabulasi.Contoh output:
Saya sengaja membuat bidang filesize 6 karakter, karena jika membuatnya lebih lama, menjadi sulit untuk secara visual membedakan seberapa besar file tersebut. Dengan cara ini, file yang lebih besar dari 1e6 KiB menonjol: dengan 1 karakter berarti 1-9 GB, dengan 2 karakter berarti 10-99 GB, dll.
Sunting: ini versi lain (sejak
find . -printf "%Tc"
crash di MinGW / MSYS):Memberikan output seperti:
Dimana:
-I{}
menyebabkan terjadinya{}
digantikan oleh argumen, dan baris baru sekarang menjadi pemisah argumen (perhatikan spasi dalam nama file di atas).ls -G
menekan pencetakan nama grup (buang-buang ruang).ls -h --si
menghasilkan ukuran file yang dapat dibaca manusia (lebih tepat dengan--si
).ls -t
mengurutkan berdasarkan waktu, yang tidak relevan di sini, tapi itulah yang biasanya saya gunakan.sumber
T@
dengans
salah satu dari perintah di atas.Varian OS X dari jawaban @ user195696:
Dengan cap waktu:
Tanpa cap waktu:
sumber
Saya menemukan bahwa ini menyelesaikan pekerjaan di Mac OS X (dan cukup umum untuk bekerja pada Unixen lainnya):
sumber
Jika
find
pilihan Anda sangat sederhana, Anda mungkin dapat melakukannya tanpa itu, dan cukup gunakanls
:sumber
Mencoba:
Tetapi juga berguna untuk memfilter data dengan
-mmin
/-mtime
dan-type
.sumber
Menggunakan:
Perintah ini akan mengurutkan file berdasarkan tanggal yang dimodifikasi.
Dan ditampilkan seperti:
sumber
Saya punya solusi sederhana yang berfungsi untuk FreeBSD (OS X) dan Linux:
sumber
Saya tidak berpikir
find
memiliki opsi untuk memodifikasi pemesanan output.-mtime
dan-mmin
akan membiarkan Anda membatasi hasil untuk file yang telah dimodifikasi dalam jendela waktu tertentu, tetapi hasilnya tidak akan diurutkan - Anda harus melakukannya sendiri. GNUfind
memiliki-printf
opsi yang, antara lain, akan memungkinkan Anda mencetak waktu modifikasi dari setiap file yang ditemukan (format string%t
atau%Tk
); yang mungkin membantu Anda mengurutkanfind
output seperti yang Anda inginkan.sumber
Saya meningkatkan jawaban Akashs dengan membuat script yang menangani spasi putih dalam nama file dengan benar:
sumber
Jika Anda ingin memesan semua file PNG berdasarkan waktu di
$PWD
:Satu garis sederhana ini memberikan semua fleksibilitas regexp pada
find
dan dils
.sumber
Anda dapat menggunakan
stat
BSD dan Linux (bukan pada POSIX) dengan cara ini:Jika Anda ingin membatasi jumlahnya:
sumber
Ada cara
sort | head
tanggal yang bersih dan kuat :Menggunakan
ls -l
untuk mencetak cantikSebagai fungsi bash :
Ini bisa dijalankan dengan satu atau dua argumen, atau bahkan tanpa:
Sampel:
Akan mencantumkan semua direktori non diurutkan berdasarkan tanggal. Tidak a:
Bahkan pada pohon sistem file besar, seperti
xargs
daftar yang sudah diurutkan, pesanan file tetap benar, bahkan jikals
harus dijalankan berkali-kali.Akan menampilkan 12 direktori terbaru bukan diurutkan berdasarkan tanggal, dengan ukuran dicetak dalam bentuk yang dapat dibaca manusia
Akan mencantumkan 42 lebih banyak symlink terbaru
Akan mencantumkan semua symlink, perangkat blok, perangkat soket dan karakter, diurutkan berdasarkan tanggal.
Pesanan pembalikan
Mengganti
head
olehtail
dan mengubah saklar darisort
danls
:Fungsi yang sama, penggunaan yang sama:
sumber
Jika Anda hanya ingin mendapatkan path lengkap dari setiap item, Anda dapat menulis seperti ini.
Di mana
-printf "% T @% p \ n" untuk memberikan kriteria penyortiran (tanggal),
'sort -nr' untuk menyortir menurut tanggal,
kepala -10 untuk daftar 10 hasil teratas,
cut -d '' -f 2 untuk memotong cap waktu terkemuka di setiap baris.
sumber
cut -d ' ' -f 2
akan rusak jika nama file mengandung spasi.Saya punya solusi sederhana.
Setelah
cd
ke direktori, gunakanfind . -iname "*" -ls
sumber