
У меня есть много подпапок внутри определенной папки, которая в свою очередь содержит много более мелких файлов. Они создаются программно, и поэтому я не знаю, сколько их там внутри.
Я решил удалить все эти подпапки и файлы и поэтому я дал команду:
rm -rf foldername/
Однако выполнение команды rm занимает так много времени, что, по моему мнению, совершенно нормально, поскольку она должна разорвать связь со всеми файлами.
Но я решил проверить, уменьшается ли размер этой папки, введя команду:
du -sh foldername/
Однако приведенная выше команда выдает мне ошибку:
du: cannot access `foldername/file': No such file or directory
Почему возникает эта ошибка?
решение1
du
, как и любая команда, которая рекурсивно обходит деревья каталогов, работает следующим образом:
- Прочитать информацию о файле, доступ к которому осуществляется через его путь¹. В случае
du
системный вызовstat
предоставляет тип файла (в частности, является ли он каталогом) и размер. Изначально имена берутся из командной строки. - Если файл является каталогом,открытьэто ичитатьсписок имен файлов.
- Для каждого имени файла в каталоге создайте путь к файлу ( ) и действуйте по нему рекурсивно, начиная с шага 1. Этот шаг может быть выполнен частично параллельно с предыдущим (это зависит от реализации).
DIRECTORY/ENTRY_NAME
rm
работает и удаляет файлы один за другим. Иногда du
считывает имя файла на шаге 2, но к тому времени, как он добирается до его обработки на шаге 3, rm
удаляет его. Увидите ли вы эту ошибку вообще и сколько раз, зависит от относительной скорости rm
и du
и в значительной степени непредсказуемо.
¹ Существует только два способа прямого доступа к файлу: по пути (включая информацию о каталоге, относительную или абсолютную) или (если файл открыт) по дескриптору.
решение2
Просто игнорируйте ошибку команды du.
Согласноэтотссылка, я мог бы игнорировать du
ошибки, просто упомянув,
du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)
Но мне более конкретно интересно узнать, что происходит с удалением файлов. Мне особенно интересно узнать, почему du
команда не смогла дать размер и почему она сообщает об ошибке, когда rm
команда отсоединила файлы.
Это объясняется вэтотссылка. Я просто перефразирую, чтобы увидеть, что здесь произошло.
- Команда
rm
отменила связь с файлом (т.е. удалила запись имени файла из его родительского каталога). - Но дескриптор файла все еще остается действительным, хотя с ним не связано имя файла. Здесь команда
du
сообщает, что не видит файл или каталог.
Проверка
Я провел еще несколько исследований, чтобы убедиться, что файлы действительно не связаны.
Я получил pid
процесс rm с помощью ps
команды. Теперь я выполнил команду ниже, чтобы проверить, доступны ли еще файлы.
lsof +L | grep 11771
Приведенная выше команда дала мне следующий вывод.
rm 11771 root 4r DIR 8,17 175882240 2 47333397 /foldername/filename
Итак, согласно приведенному выше выводу, файл не связан.
Поскольку rm
команда все еще выполняется, du
она сообщает об ошибке.