Temukan file / direktori tertua di sistem file hingga 50 TB


8

Saya perlu menemukan file tertua dengan direktori terkait di sistem file 90 TB hingga 50 TB dan kemudian memindahkannya ke sistem file lain. Mereka harus mempertahankan struktur direktori mereka karena itulah yang mengidentifikasi apa file tersebut. Jadi -

tingkat pertama / tingkat kedua / tingkat ketiga / (file)

adalah strukturnya. Saya perlu memindahkan seluruh struktur - tidak ada apa-apa di direktori tingkat atas tetapi tanpa mereka saya tidak dapat mengidentifikasi apa yang menjadi milik file karena semua file yang saya cari memiliki nama yang sama. Ketika proses selesai saya seharusnya memiliki sekitar 40 TB di sistem file asli kiri dan hampir tidak ada di sistem file baru yang tersisa karena file tertua di aslinya sekarang ada.

Terima kasih!

Jawaban:


9

Dengan alat GNU dan rsync, Anda dapat melakukan:

export LC_ALL=C # force tools to regard those file paths as arrays
                # of bytes (as they are in effect) and not do fancy
                # sorting (and use English for error/warning messages 
                # as an undesired side effect).

find . -type f -printf '%T@/%s/%p\0' | # print mtime/size/path
  sort -zn | # numerical sort, oldest first
  awk -v RS='\0' -v ORS='\0' -F / -v max=50e12 '
    {total_size += $2}
    total_size > max {exit}
    {
      sub("^[^/]*/[^/]*/", "") # remove mtime/size/
      print # path
    }' |
  rsync -nv -aHAX0 --files-from=- --remove-source-files . /dest/dir/

(Belum diuji. Ini -nuntuk dry-run. Hapus jika senang).

Perhatikan bahwa kami menghitung ukuran file kumulatif berdasarkan ukuran file ( %s, ganti dengan %buntuk penggunaan disk di sektor (dan ubah ke total_size += $2 * 512) dan abaikan tautan keras. File-file itu, ketika disalin ke sistem file target, bersama dengan direktori yang mengandung mereka kemungkinan akan berakhir menggunakan lebih dari 50TB (kecuali ada kompresi sistem file atau deduplikasi yang sedang dimainkan).


1
Jawaban jawaban yang lebih baik daripada milik saya (walaupun saya telah menambahkan total_size > max { exit 0 }skrip awk)
symcbean

@symcbean, poin bagus! Saya sudah menambahkannya sekarang. Terima kasih.
Stéphane Chazelas

Ini terlihat hebat !! Satu pertanyaan - saya berasumsi bahwa bagian "max = 50e12" dari pernyataan awk mendikte sistem yang kita inginkan 50 TB berdasarkan folder tambahan (karena ada dua untuk setiap file) jika saya perlu saya dapat mengurangi "50" sampai "49" dan itu sama dengan 49 TB?
J Telep

1
@JTelep, itu notasi ilmiah. 50e12 adalah 50 kali 10 pangkat 12 jadi 50TB (bukan 50TiB, yang Anda butuhkan 50 * 2^40). Anda juga bisa mengubahnya ke total_size += $2 + overheadtempat overheadyang didefinisikan sebagai overhead yang dikeluarkan oleh folder tersebut. Lihat juga %kalih-alih %suntuk mendapatkan penggunaan disk di KiB.
Stéphane Chazelas

2

Perintah 'ls' agak kreatif dengan stempel waktu - jadi menguraikannya bisa jadi menyebalkan. Mungkin akan jauh lebih mudah untuk mengimplementasikan ini dalam bahasa yang mengimplementasikan stat (). Beberapa versi Unix memiliki stat baris perintah - pada kotak RH terdekat:

 find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less

Tetapi ini akan berjalan seperti anjing dengan sejumlah besar file.

Dokumentasi untuk GNU awk mencakup contoh ekstensi yang menyediakan fungsi sistem file, tetapi Anda perlu melakukan beberapa pekerjaan untuk membangun dan memelihara ini.

Menulis program dari awal di PHP, C atau Perl (atau pergi, ruby ​​atau banyak bahasa lain) akan mudah tetapi di luar ruang lingkup tulisan di sini.


1
Perhatikan bahwa GNU statditambahkan lama setelah GNU findmemiliki -printfperintah (yang dapat melakukan hal yang sama seperti GNU statdengan antarmuka yang jauh lebih baik).
Stéphane Chazelas
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.