Перечислите файлы больше указанного размера, затем создайте md5sum или sha256sum из них

577
Bug J.

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

6

1 ответ на вопрос

8
styrofoam fly

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

Очень информативно, я попробую это! Как я могу получить это в текстовом файле? > Checkums.md5? Bug J. 7 лет назад 0
Конечно, просто поместите `> testsums.md5` в конце этого« скрипта ». Просто имейте в виду, что если вы поместите `checkums.md5` в текущую директорию, в нем будет хеш (контрольный файл` testsums.md5`), и этот хеш будет неправильным ... Это трудная задача для создания файл, который имеет свой собственный хэш внутри. styrofoam fly 7 лет назад 0
Если у вас есть GNU `find`, вы можете использовать` -exec md5sum {} + `для передачи всех совпадений в одну команду` md5sum` (при условии, что все они помещаются в одну командную строку). David Foerster 7 лет назад 3

Похожие вопросы