2

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

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

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

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

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

1 ответ1

4

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

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

(В случае , если вы когда - нибудь столкнуться с ним, Древнейшим (ш-Utils эры) версия позволила функцию нормализации date вы можете просто сохранить приращение дня-месяца до 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).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .