Sposta i file in un'altra directory che sono più vecchi di una data


28

Sto cercando una soluzione per spostare i file che sono più vecchi di oggi. La partizione del registro si sta riempiendo, ma non riesco a rimuoverli. Sono necessari per molto tempo. Comunque una soluzione che mi è venuta in mente è:

find /sourcedirectory -mtime 365 -exec mv "{}" /destination/directory/ \;

Funzionerebbe? Chiedere a causa di " -mtime 365 " ciò sposterebbe i file che sono più vecchi di oggi da oggi in una nuova posizione?

Grazie!

Risposte:


40

Hai quasi ragione. -mtime 365saranno tutti i file che hanno esattamente 365 giorni. Volete quelli che hanno 365 giorni o più, il che significa aggiungere un +prima del numero come questo -mtime +365.

Potresti anche essere interessato alla -maxdepth 1bandiera, che ti impedisce di spostare elementi nelle sottodirectory.

Se vuoi essere sicuro di spostare solo i file, non le directory, aggiungi -type falla riga.

Alla fine della riga aggiungiamo in \;modo che findsappia che è la fine del comando che stiamo eseguendo.

Quindi la linea dovrebbe essere:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec mv "{}" /destination/directory/ \;

Per essere al sicuro, inizia semplicemente facendo una ls -l invece di mv - in questo modo puoi verificare in anticipo che stai ottenendo esattamente i file desiderati, prima di rieseguirlo con mv, in questo modo:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec ls -l {} \;

3
Tieni presente che mtimeè il tempo di modifica (che suona come quello che probabilmente desideri, il più delle volte lo è). Se questi registri vengono letti / citati spesso, è possibile che si desideri utilizzare -atime(ora dell'ultimo accesso).
voretaq7,

2
Cosa fa la barra rovesciata alla fine di questa riga?
Ben Liyanage,

1
@BenLiyanage La barra rovesciata è un carattere di escape per il punto e virgola che segue. Il punto e virgola indica la fine execdell'istruzione. Vedi la pagina man per find.
Jenny D dice di reintegrare Monica il

4

Fai attenzione quando usi le soluzioni sopra, le ho usate e ho finito per spostare tutti i file in tutte le sottocartelle !!!!

Questo comando sposta tutti i file nella directory / source e tutte le sottocartelle nella directory sorgente:

find /sourcedirectory -mtime +365 -exec mv "{}" /destination/directory/ \;

Invece, usa l'opzione -maxdepth 1 solo per i file in / sourcedirectory

find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

La risposta più votata contiene questa nota e suggerisce l'utilizzo -type f. Intendevi invece questo per indicare che le sottocartelle vengono spostate ma il loro contenuto rimane nelle sottocartelle invece di essere spostate da esse o ...?
austinian,

1
no, intendo dire che 'find' troverà tutti i file in / sourcedirectory e tutte le sottocartelle all'interno di quella / sourcedirectory, a cui non pensavo al momento. '-Maxdepth 1' limita il 'find' a only / sourcedirectory
harleygolfguy

A proposito, avrei avuto questo come solo un commento alla risposta più votata, che era una buona risposta, ma non ho la reputazione. :)
harleygolfguy,

0

È possibile utilizzare questo comando e specificare che si trova solo per i file, non per la directory, e il file è più vecchio di un anno

find /sourcedirectory -type f -mtime +365 -exec mv "{}" /destination/directory/ \;

Perché dovrebbe usare rm? Il tuo comando cancella sia i file di registro che eventualmente la directory di destinazione.
Sven

Ops, errore mio, penso che @mYzk voglia rimuovere questi file. A cura
cuonglm

0

È possibile utilizzare il comando seguente con atime se si accede spesso ai file

find /sourcedirectory -type f -atime +365 -exec mv -t /destinationdirectory {} +;

0
$ find /sourcedirectory/ -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

find: missing argument to `-exec'

Corretto sarebbe rimuovere la barra rovesciata finale da /sourcedirectory/

$ find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

Nei miei test, non sono stato in grado di replicare l' find: missing argumenterrore, tuttavia concordo sul fatto che eliminare la barra finale /sourcedirectorysia corretto.
Guzzijason,
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.