rm -r은 재귀 적으로 제거하는 방법은 무엇입니까? 어떤 순서로?


30

작업 순서가 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를 쳤다 . 특히 & time와 함께 명령을 사용하는 동안 <3 초였습니다 . 나는 그것이 존재하지 않을 것으로 기대 하고 조사 했지만, 그것은 전체이며 영향을받지 않은 것처럼 보입니다 . 꽤 작았 기 때문에 조금 놀랍습니다 . 아마도 총 100 ~ 200MB입니다. 그러나 1TB에 불과합니다. Dest /에서 수행하면 알파벳의 양쪽 끝에 파일과 디렉토리가 모두있는 것으로 나타났습니다 (예 : .... .... ).rmcpDest/A/ B/ C/Dest/lsAFile.txtZoo.txt

운이 좋았고 rmDest / 디렉토리에 혼란을 일으키기 전에 취소 했습니까 ? 가 rm그 느린 (고맙게도!) 정말?

그렇지 않다면, rm잃어버린 것을 추측 할 수 있도록 재귀 적으로 제거 하는 방법은 무엇입니까?

나는 내가 잃어버린 것을 회복 할 것으로 기대하지 않고 잠재적으로 무엇이 날아 갔는지 궁금합니다.


답변:


34

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

- 이것은 다른 응용 프로그램이 반복적으로 이송 디렉토리를 사용하는 것이 정확히 같은 방법 find, ls -Rf

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

참고 ls하거나 echo *할 정렬 이름의 사전 식 순서로 파일. findls -f분류하지 않습니다.

신뢰할 수있는 한 가지는 인수가 순서대로 처리된다는 것입니다. 그래서 C/여전히 부분적으로 존재한다면, 그것은 Dest/손대지 않았다는 것을 의미 할 것 입니다. C/사라진 경우 Dest/디렉토리 수정 시간을 확인하고 파일 C/이 삭제 된 시간 또는 사본이 종료 된 시간과 비교하여 파일이 제거 된 위치를 알 수 있습니다 . 첫 번째 파일은 직접에있는 파일 수 삭제할 Dest/또는 어딘가에 깊은의 첫 번째 항목인지에 따라 계층 구조에서 Dest/rm트래버스에 무슨 일이 있었 디렉토리이었다 여부.

삭제 속도 rm는 대부분 삭제해야하는 파일 수의 문제입니다. 삭제 시간에 눈에 띄는 영향을 주려면 매우 큰 파일이 필요합니다. 대부분의 작업은 각 디렉토리 항목을 차례로 삭제합니다. 파일의 데이터는 지워지지 않으며 파일의 내용을 지우려면 사용중인 블록을 사용 가능한 것으로 표시하기 만하면되므로 비교적 빠릅니다.


2
-f옵션은 ls에 해당하는 것으로 문서화되어 있습니다 -aU. 여기서 -a모든 파일을 나열하고 -U정렬되지 않은 것을 의미합니다. 나는 막연 버전의 발생 기억 ls하는을 -f하지만 (내가 뭔가 다른 것으로 정의 된 생각) 일을하지 -aU않았다.
G-남자 '는 분석 재개 모니카'말한다

2
@ G-Man POSIX-f( XSI 확장으로 ) 정의합니다 . 그것은 실제로 분류되지 않은 다른 효과를 가지고 있습니다. V7로 돌아가서 이상하게도 BusyBox와는 별도로 구현을 찾기가 어려울 것입니다. -U분류되지 않은 것은 GNU 기능이므로 다른 곳에서는 존재하지 않는다고 생각합니다.
Gilles 'SO- 악의를 멈춰라


@Tim No. ls -U디렉토리에서 실행 하여 테스트 할 수 있습니다 . 이것은 rm -r해당 디렉토리에서 작동 하는 순서와 동일 합니다. 파일을 추가하거나 제거하면 다른 파일의 순서가 변경 될 수 있습니다.
Gilles 'SO- 악마 그만해'1

감사. (1) "파일을 추가하거나 제거하면 다른 파일의 순서가 바뀔 수 있습니다."따라서 실수로 부분을 제거한 후에도 ls -U남아있는 디렉토리가 손상되지 않았는지 확인하는 데 도움이되지 않습니까? (2) -U는 "디렉토리 순서로 항목 목록"을 의미합니다. -U는 디렉토리의 디렉토리 항목 순서를 의미합니까?
Tim

5

Gilles가 말했듯이 일반적으로 디렉토리 내에서 삭제 순서를 예측할 수 없으며 최상위 디렉토리 만 명령 행에서 순서대로 처리됩니다.

그러나 Unix는 디렉토리가 비어있는 경우에만 디렉토리를 삭제할 수 있기 때문에 디렉토리 계층을 아래에서 삭제한다는 보장도 있습니다. 따라서 디렉토리를 삭제하려면 먼저 디렉토리의 모든 항목을 제거해야합니다. 서브 디렉토리가 포함 된 경우 먼저 해당 내용을 제거해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.