rm -rf с отсутствующими разрешениями w на каталоги без root или chmod

Файловая система, которая сама по себе переходит в режим только для чтения, скорее всего, является результатом ошибок драйвера файловой системы. Вы можете увидеть опцию errors=remount-roв выводе mount. Это делается для защиты файловой системы от дальнейших проблем. (Можно продолжить и проигнорировать ошибку или вызвать панику в системе, см.ext4(5)). Вероятно, вы должны увидеть что-то об ошибке в dmesg.

Если это происходит неоднократно, это указывает на неисправность оборудования. Проверьте хотя бы диск и память, и делайте бэкапы, пока есть возможность.

1
22.07.2020, 14:30
4 ответа

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 с более сложной структурой папок.

2
18.03.2021, 23:18
find directory -type d -exec chmod 775 {} \;
rm -rf directory
1
18.03.2021, 23:18

Вы можете запустить небольшую оболочку в каждом каталоге, чтобы изменить его режим и удалить его содержимое:

find. -depth -type d -exec sh -c 'echo "Removing $1 contents"; chmod +w "$1" ; rm -r "$1"/*' anything {} \;
0
18.03.2021, 23:18

Я не проводил замеры производительности. Я просто думаю, что имеет смысл удалять все файлы сразу после чтения каталога (, потому что он все равно читается полностью, и вы рискуете потерять уже прочитанные метаданные из кэша страниц с помощью-depth)и изменить разрешения тех 1-го уровня подкаталоги то для которых то нужно.С большим количеством файлов и подкаталогов трудно избежать повторного чтения одного и того же содержимого каталога, а без файлов это должно быть намного быстрее.

Я предлагаю использовать скрипт-оболочку, который вызывается для каждого каталога. Этот скрипт делаетfind

  • удалить все файлы в каталоге аргументов
  • исправить права доступа уровня -1 подкаталогов, где это необходимо
  • вызов скрипта для каждого уровня -1 подкаталог
#!/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
1
18.03.2021, 23:18

Теги

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