du не может получить доступ к файлу - Ошибка «Нет такого файла или каталога»

du не может получить доступ к файлу - Ошибка «Нет такого файла или каталога»

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

Я решил удалить все эти подпапки и файлы и поэтому я дал команду:

rm -rf foldername/

Однако выполнение команды rm занимает так много времени, что, по моему мнению, совершенно нормально, поскольку она должна разорвать связь со всеми файлами.

Но я решил проверить, уменьшается ли размер этой папки, введя команду:

du -sh foldername/

Однако приведенная выше команда выдает мне ошибку:

du: cannot access `foldername/file': No such file or directory

Почему возникает эта ошибка?

решение1

du, как и любая команда, которая рекурсивно обходит деревья каталогов, работает следующим образом:

  1. Прочитать информацию о файле, доступ к которому осуществляется через его путь¹. В случае duсистемный вызовstatпредоставляет тип файла (в частности, является ли он каталогом) и размер. Изначально имена берутся из командной строки.
  2. Если файл является каталогом,открытьэто ичитатьсписок имен файлов.
  3. Для каждого имени файла в каталоге создайте путь к файлу ( ) и действуйте по нему рекурсивно, начиная с шага 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команда отсоединила файлы.

Это объясняется вэтотссылка. Я просто перефразирую, чтобы увидеть, что здесь произошло.

  1. Команда rmотменила связь с файлом (т.е. удалила запись имени файла из его родительского каталога).
  2. Но дескриптор файла все еще остается действительным, хотя с ним не связано имя файла. Здесь команда duсообщает, что не видит файл или каталог.

Проверка

Я провел еще несколько исследований, чтобы убедиться, что файлы действительно не связаны.

Я получил pidпроцесс rm с помощью psкоманды. Теперь я выполнил команду ниже, чтобы проверить, доступны ли еще файлы.

lsof +L | grep 11771

Приведенная выше команда дала мне следующий вывод.

rm   11771  root  4r DIR  8,17 175882240     2   47333397 /foldername/filename

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

Поскольку rmкоманда все еще выполняется, duона сообщает об ошибке.

Связанный контент