6

Я хотел бы знать, как создать список с md5sums из файлов в текущем каталоге - файлы, размер которых превышает указанный. Я могу сделать одно или другое, но я не знаю, как объединить оба.

1 ответ1

8

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .