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