왜 재귀가 rm과 함께 위로 올라가지 않습니까?


13

나는 일반적으로 재귀의 방향과 rm에 대해 궁금합니다.

rm 재귀는 제대로 작동합니까?

실행 중 : sudo rm -R *.QTFS현재 디렉토리 및 해당 하위의 모든 * .QTFS 파일을 삭제합니까?

에 의해 표시되는 현재 디렉토리 ls -lha에는 더 나은 단어가 없기 때문에 포함 ...링크 가 포함되어 있으므로 디렉토리 트리에서 재귀가 위를 따르지 않는 이유는 무엇입니까? RM 앱에서 인공 제한이 있나요, 또는 .하고 ..실제 일하지?


5
뿌리와 광기 때문에 그 길은 ...
jasonwryan


1
글쎄, 흥미로운 일화를 위해 ... 나는 한 시점에서 무고한 찾고있는 하위 디렉토리에서 rm -rf를 실행하여 사용자가 매우 중요한 업스트림에 물건을 열심히 연결했다는 것을 알았습니다. 예, 현재 백업이 있었고 데이터가 손실되지 않았지만주의해야 할 내용이 있습니다 ... :-)
Brian Knoblauch

@BrianKnoblauch, 하드 링크를 제거하면 어떤 피해를 입을 수 있습니까? 나는 당신의 이야기의 요점을 얻지 못했습니다 ...
Alexey

@Alexey 요점은 하드 링크 자체가 제거되지 않았다는 것입니다. 너무 ... 모든 사람의 데이터를 먹기 시작, 파일 시스템에서 더 높은 지점에 링크 된 하드 링크 된 디렉토리에 아래에 반복
브라이언 Knoblauch

답변:


18

rm 재귀는 아래로만 제대로 작동합니까?

rm -r x y삭제 xy그 밖에 부모 또는 아무것도를하고 그 안에서 모든 것을 (그들은 디렉토리에있는 경우),하지만.

실행 중 : sudo rm -R *.QTFS현재 디렉토리 및 해당 하위의 모든 * .QTFS 파일을 삭제합니까?

아뇨라는 이름의 모든 파일이 삭제됩니다 *.QTFS, 재귀 적으로 모든 파일 내부 디렉토리 라고 *.QTFS, 그 디렉토리 자체. 다른 삭제 동작을 원하면을 사용하십시오 find -delete.

에 의해 표시되는 현재 디렉토리 ls -lha에는 더 나은 단어가 없기 때문에 포함 ...링크 가 포함되어 있으므로 디렉토리 트리에서 재귀가 위를 따르지 않는 이유는 무엇입니까? RM 앱에서 인공 제한이 있나요, 또는 .하고 ..실제 일하지?

의 인위적인 한도입니다 rm.

인공적인 것은 아니지만 실제로 작동 할 수있는 유일한 방법입니다. rm상위 ..링크를 따를 경우 , 모든 링크를 다시 따라 가면 rm -r시스템의 모든 파일이 제거됩니다 . 컨텐츠를 나열 할 때 각 디렉토리 의 및 항목을 보고 해당 이유로 명시 적으로 무시합니다.../rm...

실제로 시도해 볼 수 있습니다. 실행 rm -r .및 대부분의 rm구현은 오류를 명시 적으로보고하여 작동을 거부합니다.

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(그 메시지 는 GNU에서 온rm 것이고 다른 것들은 비슷합니다). 명시 적 인수가 아닌 내재적으로 이러한 항목을 발견하면 해당 항목을 무시하고 계속 진행합니다. 이 동작은 POSIX에 필요합니다 . GNU rm와 많은 BSD에서 fts_read계층-통역 함수 패밀리에 의해 자동으로 제공됩니다 .

이나 ...실제 일하지?

.하고 ..있습니다 일반적으로 그 파일 시스템 별이지만, 실제 디렉토리 항목. 거의 항상 모든 사용자 코드에 대한 실제 항목 인 것처럼 표시됩니다. 많은 소프트웨어는 (가 아니라 rm) 런 어웨이 또는 바람직하지 않은 재귀를 포착하거나 방지하기 위해 동작을 특수하게 보여줍니다.


증거를 찾고 있거나 관심있는 사람이라면 GNU coreutils 에서 어떻게 구현되는지 살펴보십시오 .
Chris Hayes

@ChrisHayes 동등한 gitweb 링크가 답변에 있습니다. 실제 재귀 사례는 fts_read구현에 있지만 명령 줄 인수에만 해당됩니다.
Michael Homer

@MichaelHomer 아와! 이 SE 구성표에서 해당 링크 색상이 두드러 지지 않습니다 . 내 실수.
Chris Hayes

2
이 답변은 정확하지만 약간 부정확합니다. rm 바이너리가 호출되기 전에 bash에 의해 파일 이름으로 glob-expand되어 있기 때문에 rm보지 못합니다 *.QTFS. @tobyink의 답변에 따르면.
데니스

참고로, 그 ...특별한 경우의 행동은 도트 파일 존재의 원인이라고합니다
mgarciaisaia

5

Michael Homer가 작성한 내용뿐만 아니라 실수로 상위 디렉토리로 재귀하기가 어려운 또 다른 요인이 있습니다.

홈 디렉토리로 이동하여 다음과 같이 입력하십시오.

echo *s*

문자 "s"를 포함하는 파일 및 디렉토리 목록이 표시됩니다. 그러나 선행 점으로 시작하는 파일은 표시되지 않습니다. 그것들을 보여주기 위해 다음을 사용할 수 있습니다.

echo .*s*

*이 선행 점을 포함 하여 확장 을 거부하기 때문 입니다. 이것은 다음을 의미합니다.

rm -fr *

로 재귀하지 않습니다 ...

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