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파일을 하나씩 실행하고 삭제합니다. 때로는 du2단계에서 파일 이름을 읽었지만 3단계에서 파일을 처리할 때 rm삭제된 경우도 있습니다. 이 오류가 표시되는지 여부와 횟수는 합계의 상대적 속도에 따라 달라지며 rm거의 du예측할 수 없습니다.

¹ 파일에 직접 액세스하는 방법은 경로(상대 또는 절대 디렉터리 정보 포함) 또는 설명자를 통한(파일이 열려 있는 경우) 두 가지뿐입니다.

답변2

du 명령 오류를 무시하십시오.

~에 따르면이것du링크에서 다음과 같이 언급하여 오류를 무시할 수 있습니다.

du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)

하지만 좀 더 구체적으로 파일이 삭제되면 어떻게 되는지 궁금합니다. 특히 du명령이 크기를 제공하지 못하는 이유와 rm명령이 파일 링크를 해제할 때 오류를 보고하는 이유가 궁금합니다 .

이에 대한 설명은 다음과 같습니다.이것협회. 나는 여기서 무슨 일이 일어나고 있는지보기 위해 그것을 다시 표현하고 있습니다.

  1. rm명령으로 파일의 링크가 해제되었습니다. (즉, 상위 디렉토리에서 파일 이름 항목을 제거합니다.)
  2. 그러나 파일 이름이 연결되어 있지 않아도 파일 핸들은 여전히 ​​유효합니다. 여기서는 du명령이 파일이나 디렉터리를 볼 수 없다고 보고합니다.

확인하다

나는 이 파일들이 실제로 링크되어 있지 않은지 확인하기 위해 좀 더 조사를 했습니다.

pidrm 프로세스를 사용하여 얻었 습니다 ps. 이제 다음 명령을 실행하여 파일을 계속 사용할 수 있는지 확인합니다.

lsof +L | grep 11771

위 명령은 다음과 같은 출력을 제공합니다.

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

따라서 위 출력에 따르면 파일의 링크가 해제되었습니다.

명령 rm이 계속 실행 중이므로 du명령이 오류를 보고합니다.

관련 정보