Я хотел бы знать, как создать список с md5sums из файлов в текущем каталоге - файлы, размер которых превышает указанный. Я могу сделать одно или другое, но я не знаю, как объединить оба.
1 ответ
Вы можете find
трубу (которая будет список всех файлов , которые вы заинтересованы в) выход на md5sum
xargs
необходим, чтобы избежать создания цикла.
Чтобы записать это в команду:
find . -maxdepth 1 -size +30M -type f -print0 | xargs -0 md5sum
.
говорит "начать перечисление элементов из текущего каталога"-maxdepth 1
указывает на список только файлов в этом каталоге (не спускаться глубже)-size +30M
указывает на список только файлов, размер которых превышает 30 мегабайт (при необходимости вы также можете использовать суффиксыk
иG
, подробнее о его возможностях можно узнать вman find
при необходимости)-type f
избегает перечисления каталогов - вы не можете сосчитатьmd5sum
для каталога-print0
позволяетfind
отдельные имена файлов с нулевым байтом. Мы используем это, потому что все терпит неудачу, когда вы помещаете новую строку в имя файла.
xargs
будет брать данные из стандартного ввода (благодаря флагу -0
он будет обрабатывать нулевой байт как разделитель записей) и передавать их как аргументы в md5sum
.
Вы также можете сделать это без конвейера, но я считаю, что синтаксис сбивает с толку, и я предпочитаю передать его в xargs
:find . -maxdepth 1 -size +30M -type f -execdir md5sum {} \;
И, как пишет @David в комментариях, вы можете поставить +
после {}
, т.е. find . -maxdepth 1 -size +30M -type f -execdir md5sum {} + \;
,
Что это меняет? md5sum
может быть вызван для двух файлов двумя способами: md5sum file1; md5sum file2
или md5sum file1 file2
. Без +
вы получаете первую опцию, добавление +
приводит к ее выполнению вторым способом. Наиболее важным преимуществом является скорость, так как md5sum
выполняется только один раз. Это не может быть то , что полезно для некоторых программ, но в некоторых случаях, например, программа может работать на многих ядер и ускорение работы по фактору NUM_CPUS.
О том странном синтаксисе (от man find
):
-execdir команда;
Выполнить команду;
true
если возвращается0
статус. Все последующие аргументы для поиска считаются аргументами команды до аргумента, состоящего из';'
встречается. Строка'{}'
заменяется текущим именем файла, которое обрабатывается везде, где оно встречается в аргументах команды, а не только в аргументах, где он один, как в некоторых версиях find. Обе эти конструкции, возможно, должны быть экранированы (с'\'
) или заключены в кавычки, чтобы защитить их от расширения оболочкой. В разделе ПРИМЕРЫ приведены примеры использования опции-execdir
. Указанная команда запускается один раз для каждого соответствующего файла.