файлы, проиндексированные по дате производства - PullRequest
2 голосов
/ 13 мая 2010

Каждый день приложение создает файл с именем file_YYYYMMDD.csv, где YYYYMMDD - дата производства. Но иногда генерация завершается неудачно, и в течение нескольких дней файлы не создаются.

Мне бы хотелось, чтобы в скрипте bash или sh был простой способ найти имя файла самого последнего файла, созданного до указанной контрольной даты.

Типичное использование: найти последний сгенерированный файл, не учитывая файлы, созданные после 1 мая.

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 13 мая 2010

Этот скрипт избегает:

  • Повторное использование sed в цикле
  • Разбор ls
  • Создание подоболочки в цикле while
  • Обработка файлов, которые не соответствуют шаблону file_*.csv name

Вот сценарий:

#!/bin/bash
while read -r file
do
    date=${file#*_}    # strip off everything up to and including the underscore
    date=${date%.*}    # strip off the dot and everything after
    if [[ $date < $1 ]]
    then
        break
    fi
done < <(find -name "file_*.csv" | sort -r)

# do something with $file, such as:
echo "$file"

Edit:

С помощью Bash> = 3.2 вы можете сделать это с помощью регулярного выражения:

#!/bin/bash
regex='file_([[:digit:]]+).csv'
while read -r file
do
    [[ $file =~ $regex ]]
    date=${BASH_REMATCH[1]}
    if [[ $date < $1 ]]
    then
        break
    fi
done < <(find -name "file_*.csv" | sort -r)

# do something with $file, such as:
echo "$file"
0 голосов
/ 13 мая 2010

Сортировка имен файлов с помощью man 1 sort не удастся, если в имени файла есть символ новой строки.

Вместо этого мы должны использовать что-то вроде:

touch $'filename\nwith\777pesky\177chars.txt'  # create a test file

ls -1db * 

find ... -print0 | LC_ALL=C sort0 ... 

см

Найти все используемые расширения в подкаталогах,

http://codesnippets.joyent.com/posts/show/2300

0 голосов
/ 13 мая 2010

Попробуйте это:

#!/bin/bash

ls -r | while read fn; do
    date=`echo $fn | sed -e 's/^file_\([0-9]*\)\.csv$/\1/'` || continue
    if [ $date -lt $1 ]; then
        echo $fn
        exit
    fi
done

Просто назовите этот скрипт с контрольной датой, с которой вы хотите сравнить. Замените -lt на -le, если вы хотите включить контрольную дату.

Редактировать: альтернативное решение, без передачи передаваемой переменной. Обратите внимание, что я не тестировал его, но он тоже должен работать.

#!/bin/bash

ls -r | sed -e 's/^file_\([0-9]*\)\.csv$/\1/' | while read date; do
    if [ $date -lt $1 ]; then
        echo "file_${date}.csv"
        exit
    fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...