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