Linux: copia i file con date nel nome file tra due date


2

Ho una cartella piena di file in cui di tanto in tanto ho bisogno di copiare un sottoinsieme di questi da qualche altra parte per l'elaborazione.

I file hanno la data in cui sono stati creati nel nome file, ovvero nome_20131028.txt.

Come faccio a selezionare e copiare i file tra due date. In modo ottimale, vorrei creare una sceneggiatura come 'get_my_foo_files.sh 20131010 20131025' e ottenere i file tra il 10 ottobre e il 25 ottobre.

Grazie in anticipo.

Modifica : sono aperto a soluzioni anche in Python / Perl.


Tutti i nomi dei file sono uguali o differiscono?
Raystafarian,

La parte "nome file" sopra i nomi dei file completi è la stessa, differisce solo per la parte della data.
Henrik Nielsen,

Risposte:


4

Usando GNU datepuoi scorrere facilmente una serie di date in formato AAAAMMGG:

#!/usr/bin/bash
first=$1
last=$2

while [[ $first -le $last ]]; do
    match=$(date +%Y%m%d  -d $first)
    echo "filename_${match}.txt"
    first=$(date +%Y%m%d -d "$first 1 day")
done 

Aggiungi la tua elaborazione anziché echo .... Questo utilizza l' aritmetica della data , in cui "n giorno" è l'aggiunta di giorni alla data specificata, "-n giorno" funziona anche per la sottrazione (anche se fai attenzione a questo beartrap se è presente anche HH: MM).

(Nel caso in cui lo incontrassi, le versioni antiche date(era di sh-utils ) consentivano una mktime()funzione di normalizzazione, potresti semplicemente continuare ad aumentare il giorno del mese fino a 99 e lo aggiusterà in silenzio per te:

 $ date -d 20160832
 Thu Sep  1 00:00:00 IST 2016

)

Qualcosa di molto simile (ma probabilmente non identico nel comportamento) può essere fatto anche con i timestamp del filesystem usando GNU finde le sue opzioni relative al tempo di modifica ( -mtime, -daystarte altro).

Una variante forse utile è usare il globbing esteso di bash (via @(pattern)) in modo da poter gestire tutti i file in una volta sola:

#!/usr/bin/bash
first=$1
last=$2

globlist=$1
while [[ $first -le $last ]]; do
    first=$(date +%Y%m%d -d "$first 1 day")
    globlist="${globlist}|${first}"
done 

shopt -s nullglob extglob
filelist="$(echo filename_@($globlist).txt)"  # NB whitespace in filenames
echo "filelist is: $filelist"

filearr=( filename_@($globlist).txt )  # safer for troublesome names
declare -p filearr

Questo imposta anche in nullglobmodo che zero corrispondenze si traduca in una stringa vuota anziché in un errore. Ciò è utile quando è meglio eseguire una singola operazione su più file (ad esempio taro rsync).


È geniale, non sapevo dell'aritmetica della data! Ciò sarà utile in altre situazioni.
Henrik Nielsen,
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.