Как найти все файлы в папке (включая подпапки) с расширением jpg или bmp, размером от 6 до 46 килобайт, последний раз измененной с 11 по 19 июня 2011 года или с 24 июля по 2 августа включительно, и добавить все эти файлы в архив (bzip2)?
Вы можете попробовать аналогичную команду (но на самом деле она имеет недостаток ):
$ 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 день (в противном случае файлы, измененные в этот день, будут опущены).