Daftar file yang lebih besar dari {size} diurutkan berdasarkan tanggal


27

Saya ingin menyelesaikan masalah 'daftar 10 file terbaru di direktori saat ini lebih dari 20MB'.

Dengan lssaya dapat melakukan:

ls -Shal |head

untuk mendapatkan 10 file terbesar teratas, dan:

ls -halt |head

untuk mendapatkan top 10 file terbaru

Dengan menemukan yang bisa saya lakukan:

find . -size +20M

Untuk membuat daftar semua file lebih dari 20MB di direktori saat ini (dan subdirektori, yang saya tidak mau).

Apakah ada cara untuk membuat daftar sepuluh file terbaru dengan ukuran tertentu, lebih disukai digunakan ls?

Jawaban:


24

Opsi 'direktori saat ini' findadalah -maxdepth 1. Keseluruhan perintah untuk kebutuhan Anda adalah:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

atau

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

Catatan: Ini akan berfungsi untuk menemukan GNU, tetapi tidak setiap penemuan lainnya.

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

Mulai seperti @Rajish, tetapi menggunakan printfperintah dari finduntuk menentukan format output. Ada 3 format terkait waktu, atime, ctime dan mtime - %Tuntuk mtime, %Adan %Cuntuk format lainnya.

@adalah untuk menentukan format waktu dalam detik sejak zaman. %fadalah untuk nama file, \nuntuk baris baru antara 2 file.

Kemudian mengurutkan berdasarkan nomor dalam urutan terbalik memberikan file termuda pertama, dan kami mengambil 20 baris¹ dengan head.

Pada akhirnya, seddigunakan, untuk membuang informasi waktu.

¹) karena headbekerja baris demi baris, satu file dengan lebih dari 20 baris baru pada namanya, yang agak tidak biasa, tetapi tidak dilarang, dapat merusak output jika itu termasuk dalam 20 pertandingan pertama. Jika Anda memiliki file seperti itu, silakan coba singkirkan mereka - yah, untuk mengubah namanya. Mereka akan sering menjadi masalah untuk skrip sederhana.


1
Jika Anda menggunakan file's -lsperintah, karakter khusus akan dicetak sebagai karakter-escape: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Selain itu formatnya akan seperti ls -l, EoghanM juga ditentukan -l.
manatwork

printfhanya berfungsi untuk distribusi GNU tertentu.
Brethlosze

%T+menghasilkan cap waktu yang dapat dibaca manusia seperti 2018-11-06+13:37:54.4606466460yang juga dapat disortir berdasarkan sort(tanpa -n), lihat: unix.stackexchange.com/questions/29899/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

Zsh ini kualifikasi gumpal membuat ini mudah. The .kualifikasi menyeleksi hanya file biasa, Lm+20file menyeleksi yang setidaknya 20MB ditambah satu byte panjang; untuk memasukkan file dengan panjang 20MB, gunakan L+20971519. Kemudian ommengurutkan dengan mengurangi waktu modifikasi, dan [1,10]membatasi ekspansi ke 10 pertandingan pertama. Anda masih memerlukan -topsi untuk lsjika Anda ingin membuat daftar file berdasarkan tanggal; atau Anda dapat mengirimkan file ke perintah lain (yang termuda dulu). Untuk meneruskan file ke perintah lain dengan file terlama terlebih dahulu, gunakan Omuntuk mengurutkan dengan meningkatkan waktu modifikasi dan [-10,-1]untuk mengekstrak 10 pertandingan terakhir.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

2

Saya pikir ini mungkin cara yang lebih baik untuk menyelesaikan masalah ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

Untuk menghilangkan kesalahan saat menemukan mencoba mengakses file yang Anda tidak memiliki izin untuk membaca Anda mungkin ingin menambahkan

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

Ini hanya akan mencetak 10 file yang ditentukan, terlepas dari karakter baris baru yang disematkan dalam nama file. Ini menggunakan sistem fileinodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

Terima kasih atas semua jawabannya. Tujuan saya adalah sebagai berikut:

ls -halt | grep "M " |head

Meskipun ia melupakan 20 Megabita yang mendukung apa pun lebih dari satu megabita (dan di bawah satu gigabita), mudah diingat dan mempertahankan elemen yang dapat dibaca manusia dari ukuran file.


4
Anda seharusnya tidak mencoba untuk mengurai output ls, itu menunjukkan kepada Anda representasi file, tidak lebih. Untuk nama file yang sederhana, sebagian besar output akan setara dengan nama file, tetapi Anda tidak harus bergantung padanya.
Chris Down

Itu benar saya yakin, tetapi dalam hal pengguna manusia (dan output tidak disalurkan ke tempat lain), yang ini lebih mudah diingat karena dapat disatukan lebih mudah dari alat sederhana yang diketahui tldp.org/LDP/GNU-Linux- Tools-Summary / html / c1089.htm
EoghanM
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.