Медленный rm -rf на Linux-машине

Я думаю, следующий шеллскрипт сделает это.

Он проверит, что дата и время исходного имени файла являются числами, и, если это так, изменит имя в предпочтительном формате.

В противном случае файл будет пропущен, поэтому уже измененные файлы не будут затронуты.

Перейдите в каталог, в котором находятся ваши файлы, и запустите скрипт.

#!/bin/bash

re='^[0-9]+$'

for i in *.*
do
 str="$i"
# echo "${str} -----"
 date=${str:0:8}
 time=${str:9:4}
  if [[ $date =~ $re ]] && [[ $time =~ $re ]]
  then
   channel=${i#*- }
   channel=${channel% -*}
   title=${i##*- }
   ext=${title##*.}
   title=${title%%.*}
   date=${date:6:2}-${date:4:2}-${date:0:4}
   mv -nv "$i" "$title - $date - $channel.$ext"
  fi
done
0
04.12.2020, 12:16
2 ответа

Is there a way to delete many files fast without an impact on the performance of the server in general

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

Вместо

rm -rf /some/folder/*

Используйте

items=(/some/folder/*)                      # List of items to delete
prefix=".DELETE_ME.$$"

for item in "${items[@]}"
do
    x="$${item%/*}/.$prefix.${item##*/}"    # New temporary path for item to delete
    mv -f "$item" "$x" || rm -rf "$item"    # Rename or delete
done

for item in "${items[@]}"
do
    x="$${item%/*}/.$prefix.${item##*/}"
    rm -rf "$x"                             # Delete whatever is left
done >/dev/null 2>&1 &                      # Run sequentially in background

Вы можете инкапсулировать это в скрипте (разбора аргументов с помощьюfor item in "$@")или даже в виде функции оболочки.

Я использовал два цикла вместо потенциально более очевидного «переименовать и удалить в фоновом режиме», чтобы не снижать производительность сервера из-за нескольких параллельных удалений. Это не остановит воздействие, но может помочь с очевидной скоростью удаления.

1
18.03.2021, 22:45

Я думаю, проблема может заключаться в том, что вы пытаетесь удалить 116000 файлов в одном каталоге. Удаление n файлов в каталоге занимает порядка n в квадрате времени. И это может стать удивительно медленным. Даже ls -lи findувязнут. Обратите внимание, что прямой /bin/lsвсе равно будет довольно быстрым, так как ему не нужно обращаться к каждому файлу.

Секрет не в том, чтобы с самого начала разместить столько файлов в каталоге. Вместо этого создайте несколько уровней каталогов.

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

0
18.03.2021, 22:45

Теги

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