Trova i file più recenti di un giorno e copia


12

Sto lavorando a uno script che copierà SOLO i file che sono stati creati nell'ultimo giorno libero in un'altra cartella. Il problema che sto riscontrando è lo script in cui ho copiato tutti i file nella directory di origine anziché solo i file di meno di un giorno fa.

Questo è quello che ho:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

Il codice sopra copia tutti i file nella directory di origine. Se rimuovo tutti gli argomenti per 'cp', allora funziona:

find . -mtime -1 -exec cp "{}" /somefolder \;

Il codice sopra copia solo i file più recenti che voglio, ma devo preservare gli attributi usando gli argomenti cp.

Ho anche provato le variabili e per i loop pensando che forse il problema era l'opzione -exec:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

Tuttavia, quanto sopra per il loop provoca lo stesso problema, tutti i file vengono copiati. Se echo $ files vengono mostrati solo i file di cui ho bisogno.

Come posso farlo funzionare?


1
Ok, penso di averlo funzionato usando:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234,

Rsync non sarebbe lo strumento migliore per questa attività invece di cp? rsync -a destinazione
Darryl

Risposte:


9

Alcune implementazioni di cphanno -tun'opzione, quindi puoi mettere la directory di destinazione prima dei file:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Si noti che -aimplica --preservequindi ho rimosso quest'ultimo.


3

Puoi usare paxper questo come:

pax -wrT "11$(date +%H%M)," . /destination/folder

La riga di comando bit per bit:

  • -wr- quando paxvengono consegnate entrambe le opzioni -write e -read, vengono copiate. Forse utile anche qui. (ma non incluso nel comando sopra)

    • -linchiostro - che crea collegamenti reali, se possibile, piuttosto che copiare i file-dati.

    • -Xper limitarsi paxallo stesso dispositivo sorgente e / o file system.

    • -s/src regex/replace/ - che modifica i nomi dei file in-stream

    • -verbose - per la segnalazione di file provenienti / mirati.

  • -T- l' -Topzione ime seleziona i file per l'archivio di destinazione (o semplicemente copiare quando viene utilizzato con -wr) sulla base della loro /mODIFICA o inode /change (o entrambi) volte. L'impostazione predefinita è mod time. A partire dal...

uomo pax

  • ... I confronti temporali utilizzando entrambi i tempi dei file sono utili quando si utilizza pax per creare un archivio incrementale basato sul tempo (verranno archiviati solo i file che sono stati modificati durante un intervallo di tempo specificato).

  • Un intervallo di tempo è composto da sei campi diversi e ogni campo deve contenere due cifre. Il formato è:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Dove ccsono le prime due cifre dell'anno (il secolo), yysono le ultime due cifre dell'anno, la prima mmè il mese (da 01 a 12), ddè il giorno del mese (da 01 a 31), HHè il ora del giorno (da 00 a 23), MMè il minuto (da 00 a 59), ed SSè i secondi (da 00 a 59). Il campo minuto MMè obbligatorio, mentre gli altri campi sono opzionali e devono essere aggiunti nel seguente ordine:

    HH, dd, mm, yy, cc

  • Il SScampo può essere aggiunto indipendentemente dagli altri campi. Gli intervalli di tempo sono relativi all'ora corrente, quindi ...

    -T 1234/cm

  • ... selezionerebbe tutti i file con una modifica o un tempo di cambio dell'inode di 12:34 PM oggi o successivo.

  • -TÈ possibile fornire un intervallo di tempo multiplo e controllare gli arresti con la prima corrispondenza.

... quindi il 11comando lassù nel mio esempio è relativo a oggi - è uno in meno della data di oggi - che è il dodicesimo - e il resto è solo un "$(date)"formato standard seguito da una virgola.

... tranne - e l'ultima cosa degna di nota - utilizzo un percorso assoluto per la directory di destinazione - e così dovresti farlo tu. Tutti i documenti fanno riferimento a comportamenti non specificati per percorsi target relativi - e la prima volta che ho mai provato a usare paxmi stavo imprecando sottovoce per un'ora in confusione con tutti i risultati strani fino a quando ho usato un percorso assoluto.


2

Grazie a tutti per l'aiuto, farlo funzionare usando una combinazione dei tuoi suggerimenti:

è andato con il seguente codice e funziona perfettamente.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

grazie ancora!


2

Stavo facendo esattamente la stessa funzionalità ma avevo bisogno di preservare la struttura delle cartelle. Quindi quello che ho fatto è un po 'diverso.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

dove $ days è il numero di giorni $ tarpath è il percorso temporaneo per la memorizzazione di questi file. e quando volevo ripristinare.

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

Questo ha fatto il trucco per me.

Nota: se si desidera escludere alcune cartelle durante l'esecuzione del backup, è possibile utilizzare il comando seguente

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Vantaggio: 1. Ho sempre avuto una copia di ciò che ho ripristinato l'ultima volta in formato compresso.

  1. inoltre faccio una pausa tra i restauri dove posso andare e controllare quali sono quei file e, se tutto ok, procedere con lo script.

  2. Conserva la struttura delle cartelle, quindi ha semplicemente sovrascritto i file modificati dalla directory di origine alla directory di destinazione

Nota: D'altra parte se il requisito non è limitato al giorno userei rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

di più per rsyc con data qui


1

Si può anche selezionare la data e l'ora esatte oltre a tornare a un determinato numero di giorni

(Funziona bene solo nel caso in cui i nomi dei tuoi file non contengano spazi, tab o caratteri jolly)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

Sopra copia tutti i file nella directory che sono stati creati dopo il 17 dicembre 2016 alle 20:10:00 nella FOLDER (1 giorno prima di oggi :)

Fai attenzione al simbolo per il comando find, NON è questo: 'è questo, un backtick: `la selezione della data è con questo:'

Per i file con spazi, tabulazioni, newline o caratteri jolly nei loro nomi, è possibile utilizzare una delle soluzioni di Stéphane Chazelas, prima è per GNU, in secondo luogo per GNU o alcuni BSD:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


Grazie Stephane, potrebbe essere per questo che non sono riuscito a trovarlo in nessun post, anche se per il mio caso ha funzionato come un fascino. quando lo fai trova solo. -tipo f -newermt '17 dic 2016 20:10:00 '
FatihSarigol

... stampa i file creati dopo quel momento, non sono sicuro del tipo di problema che può causare. quindi uso solo i backtick per selezionare questi file da copiare. salute
Fatih Sarigol

Credo che il post che hai condiviso riguardi "Looping over", il mio codice esegue il looping del risultato di find? o sta semplicemente selezionando il risultato di ricerca da utilizzare per la copia? (Mi dispiace per 3 commenti, a quanto pare non sono ancora autorizzato a modificare i miei commenti
FatihSarigol

1
Usa find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) o find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU o alcuni BSD (il fattore limitante rispetto alla portabilità è il -newermtpredicato qui)).
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.