Удаление миллиардов файлов из каталога с одновременным наблюдением за прогрессом

Это то, что у меня сработало в Debian Jessie.

$ sudo /usr/lib/fglrx/switchlibGL amd

После этого amdcccle будет работать, и fglrxinfo покажет изменение. Мой графический процессор также стал доступен под OpenCL.

$ fglrxinfo 
display: :0.0  screen: 0
OpenGL vendor string: Advanced Micro Devices, Inc.
OpenGL renderer string: AMD Radeon HD 5800 Series
OpenGL version string: 4.5.13416 Compatibility Profile Context 15.302
36
02.12.2016, 17:25
6 ответов

Вы можете использовать rm -v, чтобы rm печатал по одной строке на каждый удаленный файл. Так вы увидите, что rm действительно удаляет файлы. Но если у вас миллиарды файлов, то вы увидите только то, что rm все еще работает. Вы не будете знать, сколько файлов уже удалено и сколько осталось.

Инструмент pv может помочь вам с оценкой прогресса.

http://www.ivarch.com/programs/pv.shtml

Вот как можно вызвать rm с помощью pv с примером вывода

$ rm -rv dirname | pv -l -s 1000 > logfile
562  0:00:07 [79,8 /s] [====================>                 ] 56% ETA 0:00:05

В этом надуманном примере я сказал pv, что есть 1000 файлов. Вывод от pv показывает, что 562 уже удалены, прошедшее время составляет 7 секунд, а оценка завершения - 5 секунд.

Некоторые пояснения:

  • pv -l заставляет pv считать по новым строкам, а не по байтам
  • pv -s number сообщает pv общее количество, чтобы вы могли оценить результат.
  • Перенаправление в logfile в конце служит для чистого вывода. Иначе строка состояния от pv смешается с выводом от rm -v. Бонус: у вас будет лог-файл того, что было удалено. Но учтите, что файл будет огромным. Вы также можете перенаправить вывод на /dev/null, если вам не нужен журнал.

Чтобы получить количество файлов, вы можете использовать эту команду:

$ find dirname | wc -l

Это также может занять много времени, если файлов миллиарды. Вы можете использовать pv здесь также, чтобы увидеть, сколько файлов было подсчитано

$ find dirname | pv -l | wc -l
278k 0:00:04 [56,8k/s] [     <=>                                              ]
278044

Здесь говорится, что потребовалось 4 секунды, чтобы подсчитать 278k файлов. Точное число в конце (278044) - это результат wc -l.

Если вы не хотите ждать подсчета, то вы можете либо угадать количество файлов, либо использовать pv без оценки:

$ rm -rv dirname | pv -l > logfile

В этом случае у вас не будет оценки до конца, но по крайней мере вы увидите, сколько файлов уже удалено. Перенаправьте на /dev/null, если вам не нужен лог-файл.


Замечание:

  • действительно ли вам нужен sudo?
  • обычно rm -r достаточно для рекурсивного удаления. нет необходимости в rm -f.
104
27.01.2020, 19:36

Посмотрите ответ Лесмана , он намного лучше моего - особенно последний пример pv , который не займет много больше времени, чем исходный тихий rm если вы укажете / dev / null вместо файл журнала .

Предполагая, что ваш rm поддерживает эту опцию (вероятно, так и есть, поскольку вы используете Linux), вы можете запустить его в подробном режиме с помощью -v :

sudo rm -rfv bolands-mills-mhcptz

Как было Как указали ряд комментаторов, это может быть очень медленным из-за большого объема вывода, генерируемого и отображаемого терминалом. Вместо этого вы можете перенаправить вывод в файл:

sudo rm -rfv bolands-mills-mhcptz > rm-trace.txt

и посмотреть размер rm-trace.txt .

28
27.01.2020, 19:36

Единственное, что вы могли бы сделать, - это запустить процесс rm в фоновом режиме (без вывода, поэтому он не будет замедляться вниз), а затем проследите за ним на переднем плане с помощью простой команды (a) :

pax> ( D=/path/to/dir ; rm -rf $D & while true ; do
...>   if [[ -d $D ]] ; then
...>     echo "$(find $D | wc -l) items left"
...>   else
...>     echo "No items left"
...>     break
...>   fi
...>   sleep 5
...> done )

27912 items left
224 items left
No items left

pax> _

Комбинацию find / wc можно заменить любым инструментом, способным дать вам единицы измерения. ты хочешь.


(a) Ну, относительно просто, по сравнению, скажем, с ядерной физикой, гипотезой Римана или тем, что купить жене на Рождество: -)

{{1} }
3
27.01.2020, 19:36

Другой вариант - наблюдать за уменьшением количества файлов в файловой системе. В другом терминале запустите:

watch  df -ih   pathname

Счетчик используемых inodes будет уменьшаться по мере выполнения rm . (Если только файлы не имеют в основном нескольких ссылок, например, если дерево было создано с помощью cp -al ). Это отслеживает процесс удаления с точки зрения количества файлов (и каталогов). df без -i будет отслеживать с точки зрения используемого пространства.

Вы также можете запустить iostat -x 4 , чтобы увидеть количество операций ввода-вывода в секунду (а также kiB / s, но это не очень важно для ввода-вывода чистых метаданных).


Если вам интересно, над какими файлами rm сейчас работает, вы можете прикрепить к нему strace и наблюдать, как unlink () (и getdent) системные вызовы извергнуты на ваш терминал. например sudo strace -p $ (pidof rm) . Вы можете ^ c отсоединить ремешок от rm , не прерывая его.

Я забываю, если rm -r изменяет каталог в дереве, которое он удаляет; если это так, вы можете посмотреть / proc / / cwd .Его / proc / / fd часто может иметь открытый каталог fd, поэтому вы можете посмотреть на него, чтобы увидеть, на что в данный момент смотрит ваш процесс rm .

23
27.01.2020, 19:36

Хотя приведенное выше ответы все используют rm , rm на самом деле может быть довольно медленным при удалении большого количества файлов, как я недавно заметил, когда извлечение ~ 100K файлов из архива .tar на самом деле заняло меньше времени, чем удаление их. Хотя это на самом деле не отвечает на заданный вами вопрос, лучшим решением вашей проблемы может быть использование другого метода удаления файлов, например, одного из одобренных ответов на этот вопрос .

Лично я предпочитаю использовать rsync -a --delete . Я считаю, что этот метод работает достаточно быстро, так что его простота использования стоит того, наиболее популярный ответ на этот вопрос , в котором автор написал программу на языке C, которую вам нужно будет скомпилировать.(Обратите внимание, что при этом каждый обрабатываемый файл будет выводиться на стандартный вывод, как и rm -rv ; это может значительно замедлить процесс. Если вам не нужен этот вывод, используйте rsync - aq --delete или вместо этого перенаправить вывод в файл.)

Автор этого ответа говорит:

Теперь программа (в моей системе) удалит 1000000 файлов за 43 секунды. Самой близкой к этому была программа rsync -a --delete, которая занимала 60 секунд (которая также выполняет удаления по порядку, но не выполняет эффективный поиск в каталогах).

Я обнаружил, что этого достаточно для моих целей. Также потенциально важно из этого ответа, по крайней мере, если вы используете ext4:

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

4
27.01.2020, 19:36

Некоторое время назад я написал что-то для печати скорости печати строк. Вы можете запустить rm -rfv | ./counter, и он будет печатать строк в секунду / мин. Хотя это и не является прямым прогрессом, он даст вам некоторую обратную связь о скорости выполнения, возможно, rm забрел в сетевую файловую систему или что-то подобное?

Ссылка на код находится здесь:

http: //www.usenix.org.uk/code/counter-0.01.tar.gz

0
27.01.2020, 19:36

Теги

Похожие вопросы