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

Я хочу оптимизировать эту команду 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 занимает меньше байтов, чем новая строка, возьмите это миллион, и вы сохраните кучу байтов.

  • Почему нам не нужно вводить пароль для установки программного обеспечения в магазине приложений на Deepin?
  • Является /etc/rc.local хорошим местом для запуска скрипта, прежде чем какой-либо (обычный) пользователь сможет войти в систему?
  • Ubuntu - блокирует доступ в Интернет для всех приложений, за исключением избранных
  • Нет меню grub после установки Ubuntu, загрузка непосредственно в Ubuntu
  • Как запретить GRUB использовать / запускать любой графический интерфейс?
  • Как загружать базовую систему дуги, возможно, без pacstrap
  • bash: перепутанный дисплей для длинных строк
  • Ubuntu 13.04 на ПК Acer x64, загружается только после запуска восстановления
  • Добавить вариант управления перегрузкой TCP в Linux Ubuntu
  • Игрок Miro не распознает субтитры из видео, закодированного ffmpeg
  • Emacs не откроет файл в репозитории Bazaar
  • Ошибка при создании виртуальной среды с помощью venv
  • Linux и Unix - лучшая ОС в мире.