Menemukan file terbesar secara rekursif

41

Saya mencoba mencari file terbesar di direktori secara rekursif. Jika ada subdirektori di dalam direktori tersebut, fungsi tersebut perlu masuk ke dalam direktori itu dan memeriksa untuk melihat apakah file terbesar ada di sana. Setelah file terbesar ditemukan, output ditampilkan dengan nama jalur relatif dan nama serta ukuran file terbesar.

EX:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

Inilah yang saya miliki:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

Saya telah terjebak untuk sementara waktu sekarang. Saya tidak bisa menerapkan ini dengan pipelining sejumlah alat Unix yang ada. Ada ide yang bagus!

pengguna2419571
sumber
stackoverflow.com/questions/12522269/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
untuk masuk hanya subdirs: for d in */ .[^.]*/; lakukan ... `
Olivier Dulac

Jawaban:

54

gunakan find(di sini asumsi GNU find) untuk menampilkan nama file dengan ukuran file. menyortir. cetak yang terbesar.

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

Itu mengasumsikan jalur file tidak mengandung karakter baris baru.


Menggunakan perulangan bashdengan implementasi GNU dari stat:

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

Ini akan jauh lebih lambat daripada solusi menemukan. Itu juga mengasumsikan bahwa nama file tidak berakhir pada karakter baris baru dan akan melewati file tersembunyi dan tidak turun ke direktori tersembunyi.

Jika ada file yang dipanggil -di direktori saat ini, ukuran file yang terbuka di stdin akan dipertimbangkan.

Waspadalah bahwa versi bashsebelum 4.3 mengikuti tautan simbolis ketika menuruni pohon direktori.

glenn jackman
sumber
Terima kasih, ini berhasil! Saya menghargai bantuannya. Saya mencoba membiasakan diri dengan pemrograman di shell. Saya tidak tahu banyak sekarang, jadi saya menghargai Anda memberi tahu saya apa yang terjadi dengan baris kode itu.
user2419571
Pertanyaan cepat: Karena penasaran apakah ada cara untuk melakukannya tanpa perintah pemipaan? Saya ingin tahu karena setiap contoh yang saya lihat telah menggunakan semacam pipa.
user2419571
2
Saya yakin ada cara lain untuk melakukannya. Filosofi UNIX adalah bahwa alat harus memiliki satu tujuan, dan untuk menyatukannya sehingga output dari satu perintah dimasukkan ke input selanjutnya.
glenn jackman
Itu masuk akal. Sekali lagi terima kasih atas bantuannya.
user2419571
2
@ user2419571:; tail -n 1 <(sort -n <(find . -type f -printf "%s\t%p\n")))
Cyrus
9

Perintah ini juga membantu mencantumkan ukuran yang ditentukan.

find . -type f -size +100M -exec ls -lh {} \;
senthil sivasamy
sumber
5

Ini berfungsi pada BSD / macOS:

find . -type f -ls | sort -k7 -r

Anda juga dapat menambahkan | head -n 3untuk menampilkan angka entri yang menarik (3 dalam hal ini).

CeDeROM
sumber
1
Jawaban ini dapat ditingkatkan dengan menjelaskan cara kerjanya. Juga, itu terlihat sangat mirip dengan jawaban yang diterima (yang tidak sepenuhnya menjelaskan cara kerjanya juga).
Dhag
man finddan man sort, gunakan brainz :-)
CeDeROM
Tidak benar-benar berfungsi pada MacOS karena gagal mengembalikan ukuran dengan benar dan mengembalikan sejumlah besar kolom.
sorin
3

Dengan zsh, untuk file biasa terbesar:

ls -ld -- **/*(.DOL[1])

(tentu saja Anda dapat mengganti ls -ld --dengan perintah apa pun. Jika menggunakan GNU lsatau yang kompatibel lihat juga -hopsi untuk ukuran yang dapat dibaca manusia )

  • .: hanya file biasa (bukan direktori, symlink, perangkat, fifos ...)
  • D: termasuk yang tersembunyi dan turun ke dirs tersembunyi
  • OL: dipesan kembali berdasarkan ukuran ( Length).
  • [1]: hanya pertandingan pertama.

Jika ada ikatan, Anda akan mendapatkan salah satu dari mereka secara acak. Jika Anda ingin yang pertama dalam urutan abjad, tambahkan ekstra on( order berdasarkan nama n) untuk mengurutkan ikatan menurut abjad.

Perhatikan bahwa itu mempertimbangkan ukuran file, bukan penggunaan disk.

Stéphane Chazelas
sumber
... Saya mulai percaya bahwa Anda berada di daftar gaji zsh;) (yang bisa sangat baik?). zsh sayangnya tidak tersedia di semua sistem ...
Olivier Dulac
Kemungkinan untuk mendapatkan sepuluh file pertama? (Tanpa melakukan sesuatu yang bodoh seperti lingkaran)
Wowfunhappy
1
@Wowfunhappy ganti [1]dengan[1,10]
Stéphane Chazelas