특정 폴더 내에 하위 폴더가 많이 있고 이러한 하위 폴더에는 더 작은 파일이 많이 포함되어 있습니다. 프로그래밍 방식으로 생성되므로 거기에 몇 개가 있는지 모르겠습니다.
이 모든 하위 폴더와 파일을 삭제하기로 결정하고 다음 명령을 실행했습니다.
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
명령이 오류를 보고합니다.