Вы можете 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
опции. Указанная команда запускается один раз для каждого соответствующего файла.