Temukan file yang lebih tua dari X hari dan hasilkan menurut ukurannya

8

Saya mencoba untuk mendapatkan file yang lebih lama dari beberapa hari dan mendaftarnya dalam urutan menurun berdasarkan ukurannya dengan semua informasi mereka (ukuran, path lengkap dll - sesuatu yang serupa yang disediakan oleh ls).

Meskipun saya dapat menemukan file yang lebih lama dengan:

find . -mtime +10

Saya tidak dapat membuat daftar informasi yang diinginkan.

pengguna148335
sumber
silakan tambahkan informasi distro dan shell Anda
lese
@lese: AIX 6.1; sementara echo $ SHELL -> / usr / bin / ksh
user148335
Ini kedengarannya seperti masalah XY ... apakah Anda benar-benar, seperti yang Anda minta, membutuhkan SEMUA file berdasarkan pesanan ukuran? atau apakah Anda (lebih mungkin) mencari file "lama" (> 10 hari) yang cukup besar dan hanya perlu, katakanlah, 200 terbesar untuk kemudian memutuskan yang mana yang dapat Anda hapus untuk menghemat ruang ?. Dalam kasus yang terakhir, dan karena Anda menggunakan AIX dengan mungkin tanpa alat gnu, kombinasi find (menghasilkan semua file> 10 hari) dan awk (menjaga 200 file terbesar dalam array, kemudian mengeluarkannya secara berurutan) akan menjadi milik Anda Taruhan terbaik
Olivier Dulac

Jawaban:

8

Asalkan jalur file Anda tidak mengandung karakter baris baru:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

Lihat findmanual , bagian Actions.

  • %s Ukuran file dalam byte.
  • %n Jumlah tautan keras ke file.
  • %m Bit izin file (dalam oktal ).
  • %u Nama pengguna file, atau ID pengguna numerik jika pengguna tidak memiliki nama.
  • %g Nama grup file, atau ID grup numerik jika grup tidak memiliki nama.
  • %t Waktu modifikasi terakhir file dalam format yang dikembalikan oleh ctimefungsi C.
  • %p Nama file.
  • %l Objek tautan simbolik (string kosong jika file bukan tautan simbolik).

BTW: Perhatikan bahwa manual POSIX find tidak menentukan sebagian besar tindakan di atas.

patryk.beza
sumber
1
Dikatakan: find: 0652-017 -printf bukan opsi yang valid.
user148335
bagi saya ini bekerja dan sepertinya solusi yang cukup bersih +1
lese
@ user148335, Anda tidak menyebutkan distro Linux apa yang Anda jalankan. Tampaknya Anda terbatas pada spesifikasi menemukan POSIX , yang cukup terbatas.
patryk.beza
1
@ patryk.beza Saya kira Anda sedang berbicara dengan user148335
lese
AIX 6.1; sementara echo $ SHELL -> / usr / bin / ksh
user148335
4

Perintah ini hanya menggunakan fitur POSIX dari finddan dari ls:

find . -type f -mtime +10 -exec ls -lS {} +

Namun, ini dapat memanggil lslebih dari sekali, jika ada sejumlah besar file di direktori saat ini (atau subdirektori secara rekursif) yang cocok dengan yang -mtime +10utama.

Jika itu memanggil lslebih dari sekali, tentu saja, penyortiran hanya akan dilakukan dalam setiap lseksekusi, bukan di beberapa eksekusi.

Namun, untuk jumlah file yang masuk akal, ini kemungkinan merupakan taruhan terbaik Anda.

Miguel G
sumber
Versi yang diperbarui tidak putus dengan spasi dalam nama
Miguel G
1
Jika lsdisahkan hanya satu argumen, ada sedikit penyortiran yang bisa dilakukan untuk itu. Dengan +alih-alih ;, itu akan lebih baik, tetapi lsmasih bisa berakhir dipanggil beberapa kali jika ada banyak file.
Stéphane Chazelas
2
Ini adalah perintah tepat yang akan saya berikan, jadi saya menambahkan teks penjelasan yang akan saya berikan untuk mengikutinya.
Wildcard
3

Dengan zsh:

ls -ldrS -- **/*(m+10)

Atau untuk menghindari penyortiran ganda (berdasarkan nama dengan zsh dan berdasarkan ukuran oleh ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

atau (jika lsdukungan Anda -Uuntuk yang tidak disortir):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

Tambahkan Dkualifikasi glob adalah Anda ingin melihat file tersembunyi juga.

Stéphane Chazelas
sumber
Apakah ini berfungsi ketika nama pengguna dan grup berisi spasi?
roaima
@roaima, ya. Kenapa tidak? Mungkin rusak untuk E2BIG, yang bisa Anda pakai dengan menggunakan zargs.
Stéphane Chazelas
Karena Anda memberikannya, saya curiga tidak apa-apa, tetapi saya perlu bertanya :-)
roaima
1

Saya pikir Anda bisa melakukan sesuatu yang mirip dengan:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

perhatikan -Sparameter lsperintah:

-S urutkan berdasarkan ukuran file

ini
sumber
Setelah menjatuhkan -d $ '\ 0' karena pesan: $ \ 0: Ini bukan pengenal saya telah berhasil mendapatkan output tetapi file tidak ditulis turun berdasarkan ukurannya
user148335
Akan pecah ketika Anda menemukan direktori di bawah /home/phphil. Cobals -ld ...
roaima
@Roaima, bagaimana kalau menggunakan find . -type fsaja?
lese
@lese Saya telah mengubah kode tapi perintahnya sepertinya membuang dua kali setiap file dari setiap subfolder. Ex.
user148335
find ... -type fakan bekerja, seperti halnya menambahkan -dbendera kels
roaima
1

coba ini:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g
darwis
sumber
Dengan opsi -n, ini bukan masalah karena saya tidak mencantumkan nama pengguna dan nama grup tetapi sebagai ganti uid dan gid
dervishe
0

Untuk one-liner yang lebih mudah, Anda bisa menggunakan findopsi -ls. Tampaknya dalam banyak kasus ukuran file berada di kolom ketujuh dari informasi yang tercantum (jadi ubah 7di akhir perintah sebagaimana mestinya jika tidak):

find . -type f -mtime +10 -ls | sort -n -r -k7
woodengod
sumber
0

Variasi lain adalah menggunakan:

  • find (untuk menemukan file yang cocok)
  • du (untuk menampilkan ukuran file dalam KB)
  • sort -n -r (untuk menyingkat dalam urutan menurun)

Inilah perintahnya:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
Stephen Quan
sumber