Linux: Copie arquivos com datas no nome do arquivo entre duas datas

1

Eu tenho uma pasta cheia de arquivos onde eu de tempos em tempos preciso copiar um subconjunto deles para outro local para processamento.

Os arquivos têm a data em que foram criados no nome do arquivo, ou seja, nome_do_arquivo_20131028.txt.

Como faço para selecionar e copiar os arquivos entre duas datas? Idealmente, gostaria de fazer um script como 'get_my_foo_files.sh 20131010 20131025' e obter os arquivos entre 10 de outubro e 25 de outubro.

Obrigado antecipadamente.

Editar : Estou aberto para soluções em Python / Perl também.

    
por Henrik Nielsen 06.11.2013 / 11:16

1 resposta

3

Usando o GNU date , você pode percorrer facilmente uma variedade de datas no formato YYYYMMDD:

#!/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 

Adicione seu processamento em vez de echo ... . Isso usa aritmética de data , onde "n dia "é adição de dias à data indicada", -n dia "também trabalha para subtração.

(Caso você já o encontre, as antigas versões date ( sh-utils ) permitiram um recurso de normalização mktime() , você poderia simplesmente continuar incrementando o dia do mês até 99, e seria silenciosamente para você:

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

Algo muito semelhante (mas possivelmente não idêntico no comportamento) também pode ser com timestamps do sistema de arquivos usando o GNU find e suas opções relacionadas ao tempo de modificação ( -mtime , -daystart e mais).

Uma variação possivelmente útil é usar o globbing estendido do bash (via @(pattern) ) para que você possa lidar com todos os arquivos de uma só vez:

#!/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

Isso também define nullglob para que zero corresponda resulta em uma string vazia em vez de um erro. Isso é útil quando é melhor realizar uma única operação em vários arquivos (por exemplo, tar ou rsync ).

    
por 06.11.2013 / 12:11

Tags