rm -r은 어떻게 재귀적으로 제거합니까? 어떤 순서로?

rm -r은 어떻게 재귀적으로 제거합니까? 어떤 순서로?

작업 순서가 있습니까 rm? 나는 rm큰 디렉토리에서 수행했는데 무엇이 삭제되었는지 확인하기 위해 어디를 봐야 하는지 궁금합니다. rm파일 작업을 먼저 수행한 다음 디렉터리 작업을 수행 합니까 ? 아니면 inode 테이블의 일부 정보를 기반으로 합니까?

사양: GNU coreutils 8.22 시스템의 rm: beagleboneblack 파일 시스템에서 실행되는 Arch Linux는 USB 2.0을 사용하는 외부 Seagate HDD(ext4)였습니다.

뒷이야기:

나는 디렉토리 정리를 수행하고 있었고 다음을 수행했습니다.

cp -r A/ B/ C/ Dest/

나도 모르게 그 말을 따라하게 됐다.

rm -r A/ B/ C/ Dest/

그냥 공연하려고 했을 때

rm -r A/ B/ C/

나는 이것을 잡고 너무 오래 지나기 전에 Ctrl+를 눌렀습니다. 구체적으로 & 와 함께 명령을 C사용했기 때문에 3초 미만이었습니다 . 나는 그것이 존재하지 않을 것이라고 기대하고 들어가서 살펴 보았지만 보라, 그것은 온전했고timermcpDest/등장영향을 받지 않도록. A/ B/ C/꽤 작았 기 때문에 이는 다소 놀라운 일이었습니다 . 총 100~200MB 정도 될 수 있습니다. Dest/그러나 1TB가 부끄럽습니다. Dest/에서 실행하면 ls알파벳 양쪽 끝에 파일과 디렉터리가 모두 있는 것으로 나타났습니다(예: AFile.txt.... .... Zoo.txt).

운이 좋아서 rmDest/ 디렉터리에 큰 피해가 생기기 전에 을 취소했습니까? 정말 그렇게 느린 가요 rm(고맙게도!)?

그렇지 않다면 rm무엇이 손실되었을지 추측할 수 있도록 재귀적으로 제거하는 방법은 무엇입니까?

나는 내가 잃어버린 것을 회복할 것이라고 기대하지 않고, 잠재적으로 무엇을 잃어버렸는지 궁금할 뿐입니다.

답변1

rm -r각 인수에 대해 차례로 작업합니다. 인수가 디렉터리인 경우 디렉터리를 나열합니다(opendir그리고readdir함수 또는 이와 동등한 방법), 각 항목에 대해 차례로 작동합니다. 항목이 디렉터리인 경우 해당 항목을 재귀적으로 탐색합니다.

find이는 다른 응용 프로그램이 디렉토리( , ls -Rf등) 를 반복적으로 탐색하는 데 사용하는 것과 정확히 동일한 방법입니다.

순회 순서는 예측할 수 없습니다. 대부분의 파일 시스템에서는 디렉터리에 파일을 추가하거나 제거하거나 이름을 바꾸지 않는 한 순서를 재현할 수 있습니다(이론적으로 순서는 완전히 무작위이고 매번 변경될 수 있지만 그런 일이 발생하는 파일 시스템은 생각할 수 없습니다). 일부 파일 시스템에서는 일반적으로 파일 이름이나 파일이 생성된 순서 또는 둘의 조합에서 순서를 추론할 수 있지만 파일 시스템의 세부 사항을 알아야 하며 상황에 따라 달라질 수 있습니다. 드라이버 버전. 순회 순서는 신뢰할 수 있는 것이 아닙니다.

이름의 사전순으로 파일을 정렬 ls하십시오 . 그리고 정렬하지 마세요.echo *findls -f

믿을 수 있는 한 가지는 인수가 순서대로 처리된다는 것입니다. 따라서 C/아직 부분적으로 남아 있었다면 이는 Dest/그대로 유지되었음을 의미합니다. 이 사라진 경우 디렉터리 수정 시간을 확인하고 삭제된 시간 또는 복사가 종료된 시간 과 비교하여 C/파일이 제거된 위치를 알 수 있습니다 . 삭제될 첫 번째 파일은 트래버스된 첫 번째 항목 이 디렉터리인지 여부 에 따라 계층 구조 내부 또는 깊은 곳에 있는 파일일 수 있습니다.Dest/C/Dest/Dest/rm

속도는 rm삭제할 파일 수에 따라 결정됩니다. 삭제 시간에 눈에 띄는 영향을 미치려면 매우 큰 파일이 필요합니다. 대부분의 작업은 각 디렉토리 항목을 차례로 삭제하는 것입니다. 파일의 데이터는 지워지지 않습니다. 파일의 내용을 지우려면 해당 파일이 사용하고 있던 블록을 무료로 표시하기만 하면 됩니다. 이는 상대적으로 빠릅니다.

답변2

Gilles가 말했듯이 일반적으로 디렉토리 내 삭제 순서를 예측할 수 없으며 최상위 디렉토리가 명령줄의 순서대로 처리된다는 점만 알 수 있습니다.

그러나 Unix에서는 디렉터리가 비어 있는 경우에만 디렉터리 삭제를 허용하므로 디렉터리 계층 구조가 아래에서 위로 삭제된다는 것도 보장됩니다. 따라서 디렉토리를 삭제하려면 먼저 그 안에 있는 모든 것을 제거해야 합니다. 하위 디렉터리가 포함된 경우 해당 콘텐츠를 먼저 제거해야 합니다.

관련 정보