Trova file / directory meno recenti nel file system fino a 50 TB


8

Devo trovare i file più vecchi con le loro directory associate in un file system da 90 TB fino a 50 TB e quindi spostarli in un altro file system. Devono mantenere la loro struttura di directory in quanto è ciò che identifica quali sono i file. Così -

primo livello / secondo livello / terzo livello / (file)

è la struttura. Devo spostare l'intera struttura: non c'è nulla nelle directory di livello superiore ma senza di esse non posso identificare a cosa appartiene il file poiché tutti i file che sto cercando hanno lo stesso nome. Quando il processo è completo dovrei avere circa 40 TB nel file system originale rimasto e quasi nulla nel nuovo file system lasciato come i file più vecchi nell'originale sono ora lì.

Grazie!

Risposte:


9

Con gli strumenti GNU e rsyncpuoi fare:

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/

(non testato. -nÈ per il funzionamento a secco. Rimuovere se felice).

Si noti che stiamo calcolando la dimensione cumulativa del file in base alle dimensioni del file ( %s, sostituirlo con %bper l'utilizzo del disco nei settori (e passare a total_size += $2 * 512) e ignorando i collegamenti reali. Questi file, quando copiati nel file system di destinazione, insieme alle directory che li contengono probabilmente finiranno per usare più di 50 TB (a meno che non ci sia compressione o deduplicazione del file system in gioco).


1
Risposta migliore della mia (anche se avrei aggiunto total_size > max { exit 0 }a alla sceneggiatura di awk)
symcbean

@symcbean, buon punto! L'ho aggiunto ora. Grazie.
Stéphane Chazelas,

Questo sembra fantastico !! Una domanda però - suppongo che la parte "max = 50e12" dell'istruzione awk imponga al sistema che vogliamo 50 TB, quindi in base a cartelle extra (poiché ce ne sono due per ogni file) se necessario, potrei ridurre che da "50" a "49" e che equivarrebbe a 49 TB?
J Telep,

1
@JTelep, questa è notazione scientifica. 50e12 è 50 volte 10 alla potenza di 12 quindi 50TB (non 50TiB, di cui avresti bisogno 50 * 2^40). Puoi anche cambiarlo total_size += $2 + overheaddove overheadè definito come il sovraccarico sostenuto da quelle cartelle. Vedi anche %kinvece di %sottenere l'utilizzo del disco in KiB.
Stéphane Chazelas,

2

Il comando 'ls' è in qualche modo creativo con i timestamp - quindi analizzarli può essere una seccatura. Probabilmente sarebbe molto più semplice implementarlo in un linguaggio che implementa stat (). Alcune versioni di Unix hanno una riga di comando stat - su un box RH vicino:

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

Ma questo funzionerà come un cane con un gran numero di file.

La documentazione per GNU awk include un'estensione di esempio che fornisce le funzioni del filesystem, ma dovresti fare un po 'di lavoro per costruirlo e mantenerlo.

Scrivere un programma da zero in PHP, C o Perl (o go, ruby ​​o molte altre lingue) sarebbe semplice ma al di là dello scopo di un post qui.


1
Nota che GNU è statstato aggiunto molto tempo dopo che GNU findaveva un -printfcomando (che può fare lo stesso di GNU statcon un'interfaccia molto migliore).
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.