Мне было интересно, есть ли способ отобразить какую-то информацию о прогрессе при поиске файлов в Linux с помощью find
. Я часто нахожусь в поиске файлов на большом диске, и какой-то индикатор прогресса был бы очень полезен, например, строка или, по крайней мере, текущая папка "находит" поиск в. Есть ли скрипты, которые делают это, или find
поддерживают некоторые хуки ?
24
Ответы:
с помощью этого трюка вы можете увидеть текущую папку - но без индикатора выполнения - извините.
источник
Маленькая утилита под названием pv (pipe viewer) может помочь. Из фантастического резюме Петериса Круминьша:
Pipe viewer - это инструмент на основе терминала для мониторинга прохождения данных по конвейеру.
Вы можете использовать PV несколькими способами. Играя здесь, я помещаю его сразу после канала, чтобы отслеживать ход вывода, сгенерированного командой find (должен передать stdin в stdout без изменений)
который покажет вывод примерно так:
(Я перенаправил stdout в / dev / null, чтобы видеть индикатор выполнения в действии без пролетающего выхода. Вероятно, это не ваше намерение найти, так что подгоняйте соответственно)
Я честно не уверен, насколько хорошо это работает в дикой природе. Для «дорогих» находок, подобных приведенной выше (обход от корня), он работал довольно хорошо. Для более простых команд в более глубоком узле в дереве каталогов pv с треском провалился. Эти команды возвращают результаты немедленно, поэтому, вероятно, здесь стоит индикатор выполнения.
В любом случае, поиграйте и посмотрите, работает ли это вообще так, как вам нужно. Пища для размышлений, по крайней мере.
источник
find
, ниpv
знать, сколько времени займет поиск, поэтому они не могут вычислить процент. Все, что мы можем видеть вpv
выводе, это время с момента начала поиска.yes | pv > /dev/null
наблюдатьЯ искал это сегодня и попал сюда через 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
он все еще работает и как далеко он продвинулся.источник
Есть пример параллельных поисков с
find
inman 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.Обратите внимание, что вы торгуете / значительной / потерей производительности в обмен на возможность смутно видеть, что он делает.
источник
Это список текущих файлов, открытых поиском , так что это то же самое, что поиск ищет «прямо сейчас».
Он облегчен как простой адрес запроса файловых описаний, используемых find каждую секунду и не вмешивается в сам поиск . Также вы можете сделать это с любой программой, которую пожелаете.
Он
grep -v /dev/
предназначен для скрытия файлов STDOUT, STDIN и STDERR, которые используются для получения и печати данных на вашей консоли.источник