Файловая система, которая сама по себе переходит в режим только для чтения, скорее всего, является результатом ошибок драйвера файловой системы. Вы можете увидеть опцию errors=remount-ro
в выводе mount
. Это делается для защиты файловой системы от дальнейших проблем. (Можно продолжить и проигнорировать ошибку или вызвать панику в системе, см.ext4(5)
). Вероятно, вы должны увидеть что-то об ошибке в dmesg
.
Если это происходит неоднократно, это указывает на неисправность оборудования. Проверьте хотя бы диск и память, и делайте бэкапы, пока есть возможность.
rsync
с пустым фиктивным каталогом все в порядке:mkdir empty; rsync -r --delete empty/ targetdir/; rmdir empty targetdir
С 10-кратным повторным тестом на простом примере это заняло 10 -14 с (14 было выбросом, все остальные заняли 10 или 11 с ),
против chmod -R u+w targetdir && rm -rf targetdir
, что заняло 19 -25 с
и find targetdir -type d -exec chmod 755 {} \; && rm -rf targetdir
, который занял 12 -16 секунд, но, вероятно, ухудшится больше, чем rsync с более сложной структурой папок.
find directory -type d -exec chmod 775 {} \;
rm -rf directory
Вы можете запустить небольшую оболочку в каждом каталоге, чтобы изменить его режим и удалить его содержимое:
find. -depth -type d -exec sh -c 'echo "Removing $1 contents"; chmod +w "$1" ; rm -r "$1"/*' anything {} \;
Я не проводил замеры производительности. Я просто думаю, что имеет смысл удалять все файлы сразу после чтения каталога (, потому что он все равно читается полностью, и вы рискуете потерять уже прочитанные метаданные из кэша страниц с помощью-depth
)и изменить разрешения тех 1-го уровня подкаталоги то для которых то нужно.С большим количеством файлов и подкаталогов трудно избежать повторного чтения одного и того же содержимого каталога, а без файлов это должно быть намного быстрее.
Я предлагаю использовать скрипт-оболочку, который вызывается для каждого каталога. Этот скрипт делаетfind
#!/bin/bash
set -x
dir_path="$1"
test -d "$dir_path" || exit 1
declare -i tests_x=0
declare -i tests_x_limit=30
while true; do
# there is a race condition between the -exec + and xargs
if [ -x "$dir_path" ]; then
break
else
sleep 1
fi
tests_x+=1
if [ "$tests_x" -gt "$tests_x_limit" ]; then
exit 1
fi
done
find "$dir_path" -mindepth 1 -maxdepth 1 -type f -delete -o -type l -delete \
-o -\( -type d ! -perm -700 -exec chmod u=rwx {} +, -print0 \) |
xargs -0 -n 1 -r "$0"
И запустите это с помощью
deletion.sh /start/dir
Вам понадобится rm -r
впоследствии, так как описанный выше подход не удаляет каталоги (и не может сделать это полезным (, т.е. быстрее, чем rm -r
), ИМХО ).
Независимо от командного подхода это может помочь увеличить время фиксации файловой системы. Итак, дляext4
:
mount -o remount,commit=60 /path/to/mp