Я думаю, следующий шеллскрипт сделает это.
Он проверит, что дата и время исходного имени файла являются числами, и, если это так, изменит имя в предпочтительном формате.
В противном случае файл будет пропущен, поэтому уже измененные файлы не будут затронуты.
Перейдите в каталог, в котором находятся ваши файлы, и запустите скрипт.
#!/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
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 "$@"
)или даже в виде функции оболочки.
Я использовал два цикла вместо потенциально более очевидного «переименовать и удалить в фоновом режиме», чтобы не снижать производительность сервера из-за нескольких параллельных удалений. Это не остановит воздействие, но может помочь с очевидной скоростью удаления.
Я думаю, проблема может заключаться в том, что вы пытаетесь удалить 116000 файлов в одном каталоге. Удаление n файлов в каталоге занимает порядка n в квадрате времени. И это может стать удивительно медленным. Даже ls -l
и find
увязнут. Обратите внимание, что прямой /bin/ls
все равно будет довольно быстрым, так как ему не нужно обращаться к каждому файлу.
Секрет не в том, чтобы с самого начала разместить столько файлов в каталоге. Вместо этого создайте несколько уровней каталогов.
В противном случае вам просто нужно подождать некоторое время, чтобы удалить.