Как архивировать файлы с несколькими условиями?

Как найти все файлы в папке (включая подпапки) с расширением jpg или bmp, размером от 6 до 46 килобайт, последний раз измененной с 11 по 19 июня 2011 года или с 24 июля по 2 августа включительно, и добавить все эти файлы в архив (bzip2)?

2
задан 12 November 2011 в 22:01

1 ответ

Вы можете попробовать аналогичную команду (но на самом деле она имеет недостаток ):

$ find . \( -name "*.jpg" -o -name "*.bmp" \) -and \( -size +6k -and -size -46k \) -and \( \( -newermt "2011-06-11" -and ! -newermt "2011-06-19" \) -or \( -newermt "2011-07-24" -and ! -newermt "2011-08-02" \) \) -print0 | xargs -0 tar cjf out.tar.bz2 --files-from=-

Не уверен насчет дат, хотя. Он работает для меня как YYYY-MM-DD, но может измениться в зависимости от языковых настроек.

Обновление:

В предыдущем примере произошла большая концептуальная ошибка.

В основном, команда xargs работает в «проходах» (например, берет столько имен файлов, сколько возможно, чтобы втиснуть их в командную строку и вызывает команду tar). Так out.tar.bz2 переписывается при каждом проходе .

Это может быть не замечено с несколькими десятками тестовых файлов, но несколько сотен наверняка вызовут ошибку. Поэтому команду необходимо переписать следующим образом:

$ find . \( -name "*.jpg" -o -name "*.bmp" \) -and \( -size +6k -and -size -46k \) -and \( \( -newermt "2011-06-11" -and ! -newermt "2011-06-20" \) -or \( -newermt "2011-07-24" -and ! -newermt "2011-08-03" \) \) -print0 | tar cjf out.tar.bz2 --null --files-from=-

Основное отличие заключается в отсутствии xargs и использовании опции --null для tar. Эта опция скажет tar прочитать имена файлов с нулевым символом в конце (как создается опцией find commands -print0). Вся причина этих имен файлов с нулевым символом в конце состоит в том, чтобы избегать имен файлов, содержащих специальные символы (например, пробел), которые в противном случае нарушили бы команду tar.

Другой возможной ошибкой, на которую следует указать, является спецификация диапазона дат . Верхний предел диапазона дат должен быть увеличен на 1 день (в противном случае файлы, измененные в этот день, будут опущены).

0
ответ дан 12 November 2011 в 22:01

Другие вопросы по тегам:

Похожие вопросы: