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

24

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

Влад Балмос
источник
спасибо за ответы, я проверю все решения и решил, какое из них лучше. Если бы это было до меня, я бы отметил все ответы как принятые.
Влад Балмос
В зависимости от того, какие критерии поиска вы используете, найдите гораздо быстрее, чем найти
B14D3

Ответы:

28

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

 watch readlink -f /proc/$(pidof find)/cwd
ThorstenS
источник
это круто. Следует отметить, что вам нужны привилегии суперпользователя для доступа к cwd. Благодарность!
Влад Балмос
Работает отлично.
Джесси Глик
8

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

Pipe viewer - это инструмент на основе терминала для мониторинга прохождения данных по конвейеру.

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

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

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

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

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

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

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

tcdyl
источник
Что бы показывал этот индикатор? Ни find, ни pvзнать, сколько времени займет поиск, поэтому они не могут вычислить процент. Все, что мы можем видеть в pvвыводе, это время с момента начала поиска.
Минаев
Это верно. Я думал, что где-то происходит какое-то волшебство, которое позволяет pv проверять ход прохождения каталога (что неверно). Учитывая стандартный ввод с постоянной скоростью, pv просто перемещает индикатор выполнения с постоянной частотой. Попробуйте yes | pv > /dev/nullнаблюдать
tcdyl
1
+1 за приятную полезность
Влад Балмос
Оценка прогресса не тривиальна. Даже веб-браузеры, загружающие страницы, не могут этого сделать. Я предполагаю, что для содержимого файла вы можете разделить его на размер, но для потоков Unix вы не знаете, что общий объем данных обычно равен, и этот инструмент предназначен для гибкой работы с любыми видами потоковых данных, а не только с файлами.
Шридхар Сарнобат
7

Я искал это сегодня и попал сюда через 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 (filedescriptor) cwd (текущий рабочий каталог)
  • +r 10 = показывать вывод каждые 10 секунд, пока не будут найдены открытые файлы (поиск завершен)

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

Мари Фишер
источник
5

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

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

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

Минаев
источник
Я не проверял это, но я думаю, что это правильный путь.
Рольф
2

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

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

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

Shadur
источник
1

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

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

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

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

Габриэль Сарайва
источник