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

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

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

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

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