Назад | Перейти на главную страницу

Linux команда find - показать прогресс

Мне было интересно, есть ли способ отображать какую-то информацию о ходе поиска файлов в Linux с помощью find. Я часто замечаю, что ищу файлы на большом диске, и какой-то индикатор прогресса был бы очень полезен, например, полоса или, по крайней мере, текущий каталог, в котором "находит" поиск. Есть ли какие-нибудь скрипты, которые делают это или делают find поддерживать какие-то крючки?

с помощью этого трюка вы можете видеть текущую папку - но не индикатор выполнения - извините.

 watch readlink -f /proc/$(pidof find)/cwd

Маленькая утилита под названием pv (просмотрщик труб) может Помогите. Из фантастическое резюме Автор: Петерис Круминьш:

Средство просмотра каналов - это инструмент на базе терминала для отслеживания прохождения данных по конвейеру.

Вы можете использовать pv разными способами. Играя здесь, я ставлю его сразу после канала, чтобы отслеживать прогресс вывода, сгенерированного find (должен передать stdin в stdout нетронутым)

find / -mtime -1h | pv > /dev/null

который покажет вывод примерно так:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(Я перенаправил stdout в / dev / null, чтобы я мог видеть индикатор выполнения в действии без пролета вывода. Вероятно, это не ваше намерение с find, поэтому настройте его соответствующим образом)

Честно говоря, я не уверен, насколько хорошо это работает в дикой природе. Для «дорогостоящих» находок, подобных приведенной выше (переход от root), она работала достаточно хорошо. Для более простых команд в более глубоком узле дерева каталогов pv с треском провалился. Эти команды немедленно возвращают результаты, поэтому индикатор выполнения, вероятно, здесь не подходит.

В любом случае, поиграйте и посмотрите, работает ли это вообще для того, что вам нужно. По крайней мере, пища для размышлений.

Я искал это сегодня и попал сюда через Google. У меня была давняя находка, работающая на OS X, и, очевидно, watch там не существует. Итак, вот еще одно решение:

lsof -Fn -a -c find -d cwd +r 10

  • lsof = список открытых файлов
  • -Fn = просто покажите имя файла / каталога (с префиксом 'n', пропустите это, если вы предпочитаете полный lsof вывод
  • -a = сказать lsof показать только совпадающие строки все критериев (по умолчанию показывает соответствие строк любой критерии)
  • -c find = показать файлы / каталоги, открытые процессом с именем find (фактически, процесс, имя которого начинается с find, но это чувствительно к регистру, поэтому Finder не появится)
  • -d cwd = показать строки с FD (дескриптор файла) cwd (текущий рабочий каталог)
  • +r 10 = показывать вывод каждые 10 секунд, пока не будут найдены открытые файлы (поиск завершен)

Это покажет каталог find обрабатывается каждые 10 секунд, поэтому он должен дать представление о том, find все еще работает, и насколько далеко он продвинулся.

Вот пример параллельного поиска с find в man find. Используя его, вы можете выполнять несколько проверок для каждого элемента, выполняя несколько действий в зависимости от того, какое условие работает. Первая проверка может быть, например, простой-print, поэтому все имена выводятся на стандартный вывод. Вторая проверка сделает то, что вы хотите. Что-то вроде:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

Если вторая проверка также должна отображать имена файлов, вы можете перенаправить одно из них на stderr, используя -fprint /dev/stderr.

AFAIK, это не так, и реализация этого была бы нетривиальной.

... Хм. Возможно, скрипт запущен find <target dir> -type d сначала, сохраняя список, а затем повторяя каждый каталог перед запуском find <list item> -maxdepth 1 <rest of find parameters> в цикле for.

Обратите внимание, что вы торгуете / значительной / потерей производительности в обмен на возможность смутно видеть, что он делает.

Это список текущих файлов, открытых найти, так это то же самое, что найти смотрит "прямо сейчас".

Это легкий, как просто адрес запроса описаний файлов, используемых найти каждую секунду и не вмешивайся найти сам. Также вы можете сделать это с любой программой, какой захотите.

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

В grep -v /dev/ заключается в том, чтобы скрыть файлы STDOUT, STDIN и STDERR, которые используются для получения и печати данных на вашей консоли.

Не точный ответ на вопрос, но я полагаю, что большинство случаев использования find вовлекать выполнение чего-то нетривиального с результатами, например, связывание каждого результата с tesseract для обработки OCR.

Элегантный способ получить индикатор выполнения - использовать GNU Parallels с --bar вариант (в качестве альтернативы есть также --progress вариант).

Минимальный пример:

seq 1000 | parallel --bar sleep

Производит:

0% 3:997=16m12s 11