Команда пошуку Linux - показати прогрес


24

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


дякую за відповіді, я перевірю всі рішення та вирішив, який із них кращий. Якби це було до мене, я б позначив усі відповіді прийнятими.
Влад Бальмос

залежно від того, якими критеріями пошуку ви користуєтеся, знайти locate набагато швидше, ніж знайти
B14D3

Відповіді:


28

за допомогою цього фокусу ви можете побачити поточну папку - але немає смужки прогресу - вибачте

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

круто. Слід зазначити, що вам потрібні привілеї суперпользователя для доступу до cwd. Спасибі!
Влад Бальмос

Працює чудово.
Джессі Глік

8

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

Трубопровідник - це термінальний інструмент для контролю за ходом даних по трубопроводу.

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

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

який покаже вихід таким чином:

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

(Я перенаправляв stdout в / dev / null, щоб я міг бачити смужку прогресу в дії, не виходячи з нього. Це, швидше за все, не ваш намір знайти, тому підготуйте відповідно)

Я чесно не впевнений, наскільки добре це працює в дикій природі. Для "дорогих" знахідок, подібних до вищезгаданих (проходження від кореня), схоже, це спрацювало досить добре. Для більш простих команд у більш глибокому вузлі в дереві каталогів pv пошкоджено. Ці команди негайно повертають результати, тому тут, ймовірно, смуга ходу є спірною.

У будь-якому випадку пограйте і подивіться, чи це взагалі працює для того, що вам потрібно. Принаймні, їжа для роздумів.


Що б показав цей бар прогресу? Ні 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 (fileescriptor) cwd (поточна робоча директорія)
  • +r 10 = показувати вихід кожні 10 секунд, поки не знайдені відкриті файли (пошук закінчено)

Це покаже, що каталог findобробляється кожні 10 секунд, тому він повинен дати уявлення, чи findвсе ще працює і як далеко він просунувся.


5

Наведено приклад паралельних пошукових запитів findу man find. Використовуючи його, ви можете виконувати кілька перевірок для кожного елемента, виконуючи кілька дій, залежно від того, яка умова працює. Перша перевірка може бути, наприклад, простою -print, тому всі імена друкуються до stdout. Друга перевірка зробить те, що ви хочете. Щось на зразок:

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

Якщо друга перевірка повинна також відображати імена файлів, ви можете перенаправити одну з них на більш жорстку, використовуючи -fprint /dev/stderr.


Я цього не перевіряв, але думаю, що це правильний шлях.
Рольф

2

AFAIK, це не так, і реалізувати це було б нетривіально.

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

Зауважте, що ви торгуєте / значною / втратою продуктивності в обмін на те, що зможете неясно бачити, що це робить.


1

Це список поточних файлів, відкритих методом find , тож це те саме, що знаходить "зараз".

Його легкий, як просто запит, адреса опису файлів, що використовується шляхом пошуку щосекунди і не втручається в пошук . Крім того, ви можете зробити це з будь-якою програмою.

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

grep -v /dev/Це приховати файли STDOUT, STDIN і STDERR, які є файлами , використовуваними для прийому і друку даних на консолі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.