Linux: копировать файлы с датами в имени файла между двумя датами

2

У меня есть папка, полная файлов, где мне время от времени нужно копировать часть их в другое место для обработки.

Файлы имеют дату, когда они были созданы в имени файла, то есть filename_20131028.txt.

Как мне выбрать и скопировать файлы между двумя датами? В идеале я хотел бы создать скрипт типа get_my_foo_files.sh 20131010 20131025 и получать файлы в период с 10 по 25 октября.

Заранее спасибо.

Изменить : я открыт для решений в Python / Perl, а также.

Хенрик Нильсен
источник
Все ли имена файлов одинаковые или они различаются?
Райстафариан
Часть имени файла над полными именами файлов одинакова, они отличаются только в части даты.
Хенрик Нильсен

Ответы:

4

Используя GNU, dateвы можете легко проходить по диапазону дат в формате ГГГГММДД:

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

Добавьте свою обработку вместо echo .... При этом используется арифметика даты , где «n день» - это добавление дней к заданной дате, «-n день» также работает для вычитания (хотя следите за этим beartrap, если также присутствует HH: MM).

(В случае, если вы когда-либо сталкивались с этим, в древних date( эпоха sh-utils ) версиях была предусмотрена mktime()функция нормализации, вы можете просто увеличивать число дней до 99, и это молча исправит это для вас:

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

)

Нечто подобное (но , возможно , не идентичны в поведении) также может быть сделано с файловой системой меток времени с использованием GNU findи связанные с ним время изменения параметров ( -mtime, -daystartи многое другое).

Возможно, полезным вариантом будет использование расширенного сглаживания bash (через @(pattern)), чтобы вы могли обрабатывать все файлы за один раз:

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

Это также устанавливает nullglobтак, чтобы нулевое совпадение приводило к пустой строке, а не к ошибке. Это полезно, когда лучше выполнить одну операцию над несколькими файлами (например, tarили rsync).

mr.spuratic
источник
Это замечательно, я не знал о дате арифметики! Это пригодится в других ситуациях.
Хенрик Нильсен