Оптимизировать / заменить команду «найти»

Я хочу оптимизировать эту команду find. Нам нужно переместить кучу (иногда почти миллион) файлов в каталог для дальнейшей обработки. Мы ищем способ увеличить скорость этой команды, так как это может занять несколько часов с большим количеством файлов. Проблема в том, что нам нужны файлы размером не менее 1 минуты, прежде чем перемещать их, так как мы не хотим перемещать файлы, которые все еще можно записать.

find path -name *.cdr.xml -mmin +1 -exec mv {} /path 

Изменить: эта команда запускается как часть скрипта python, и мы ДОЛЖНЫ ждать, пока все файлы будут найдены и перемещены до продолжения с помощью скрипта python.

Все имена файлов – UUID.

2 Solutions collect form web for “Оптимизировать / заменить команду «найти»”

Одно улучшение производительности может быть достигнуто за счет использования -exec + заканчивающегося действием -exec find которое приведет к -exec только один раз.

Хотя в случае ; , -exec будет разветвляться каждый раз для нового аргумента.

Таким образом, вы можете использовать:

 find path -type f -name '*.cdr.xml' -mmin +1 -exec mv -t /path {} + 

Если есть вероятность дублировать имена файлов:

 find path -type f -name '*.cdr.xml' -mmin +1 -exec mv -it /path {} + 

Или

 find path -type f -name '*.cdr.xml' -mmin +1 -exec mv --backup=numbered -t /path {} + 

--backup=numbered mv приведет к пронумерованной резервной копии файлов вместо перезаписи в случае одинаковых имен файлов в месте назначения.

Вы можете взглянуть на Watchdog ( https://github.com/gorakhargosh/watchdog/ ), чтобы сохранить всю свою логику на питоне, вы можете смотреть каталог и перемещать каждый файл через минуту без изменений.

Другое решение – использовать rsync для передачи всех файлов из вывода find вместо построения с помощью -exec .

Небольшое объяснение:

find ... -exec ... \; -> Это приведет к выполнению команды для каждого результата, что добавит много накладных расходов и очень медленно.

find ... -exec ... + -> Это приведет к объединению всех результатов и выполнению команды только один раз, это очень быстро, но вы можете достичь символьного ограничения оболочки для команды (особенно с миллионами файлов).

Теперь с помощью rsync :

find path -name *.cdr.xml -mmin +1 -print0 | rsync --remove-source-files -0 --files-from=- ${DESTINATION}

Разъяснение:

find ... -print0 | -> Это передаст все результаты NULL, разделенные на канал, который будет обрабатываться rsync с другой стороны.

--remove-source-files -> Это самоочевидное, как и mv .

--files-from=- -> Это будет читать stdin из трубы

-0 -> Это будет читать список с нулевым завершением вместо строк из канала.

Почему NULL? … Чтобы немного ускорить работу, NULL занимает меньше байтов, чем новая строка, возьмите это миллион, и вы сохраните кучу байтов.

  • Как проверить, включена ли горячая замена или горячая вилка на моей машине Linux
  • mkfs.xfs / dev / custom_dev
  • «Открыть конфликт .bash_profile» на Ubuntu
  • Альтернатива Webmin, которая устанавливает и запускает клиентскую машину и обменивается данными через SSH
  • Использовать общие библиотеки в / usr / local / lib
  • Прокладывайте все через Public IP, кроме SSH, через порт 22 через OPEN VPN
  • Сеть не работает на сервере ubuntu 12.10 на B75MA-P45 mobo
  • Использование preseed (Debian / Ubuntu) для разделения RAID и шифрования
  • График слишком большой для растровых изображений cairo-renderer Ошибка
  • как изменить разбиение?
  • Как восстановить отсутствующий файл
  • Linux и Unix - лучшая ОС в мире.