하위 디렉터리의 파일과 폴더를 반복적으로 삭제합니다.

하위 디렉터리의 파일과 폴더를 반복적으로 삭제합니다.

"전송" 폴더가 있습니다. 이 전송 폴더에는 "user1", "user2" 등의 사용자 폴더가 있습니다. 콘텐츠(즉, 사용자 폴더의 모든 파일 및 폴더)를 (정기적으로) 삭제하고 싶지만 전송 폴더나 사용자 폴더는 삭제하고 싶지 않습니다.

새 사용자가 추가될 때마다 각 새 사용자의 폴더에 호출을 수동으로 추가하지 않고도 쉘 스크립트/명령을 사용하여 이 작업을 수행하려면 어떻게 해야 합니까?

답변1

find이를 수행하려면 다음 명령을 사용할 수 있습니다 .

find /path/to/transfer -mindepth 2 -delete

-mindepth 2인수는 find무시할 디렉터리의 처음 두 수준을 지시합니다. 디렉터리 자체와 그 안에 직접 있는 모든 파일과 폴더가 검색됩니다.

-delete인수는 단순히 find모든 파일을 삭제하라고 지시합니다.

-mtime필요한 경우(예를 들어) 언제든지 더 많은 매개변수를 추가할 수 있습니다.

답변2

실패한 답변:

rm -R 전송 /사용자*/.

예를 들어:

$ rm -R transfer/user*/.
rm: refusing to remove '.' or '..' directory: skipping 'transfer/user1/.'
$

모든 사용자 콘텐츠를 삭제하고 user* 디렉터리는 비워 둡니다. "점"/"마침표"/"현재 디렉터리"는 삭제되지 않지만 해당 위치에서 반복 삭제를 위한 시작점으로 사용할 수 있습니다.

고쳐 쓰다:안타깝게도 이 답변 사용에 대한 제안을 철회해야 합니다. 실제로 포스팅하기 전에 테스트를 했었는데, 안된다는 소식을 듣고 다시 테스트를 해보니 실패했습니다. 간단히 말해서 아무것도 삭제되지 않았습니다. 아무래도 제가 이전에 테스트를 잘못한 게 틀림없었습니다. 이 문제를 처리할 방법을 찾았지만 업데이트가 너무 달라서 이 답변에 대한 기존 의견이 업데이트와 잘 일치하지 않는다고 판단하여 다른 (다시 테스트한) 솔루션 솔루션을 다른 답변으로 게시했습니다.

답변3

for x in transfer/user* ; do cd $x ; echo rm -R $( ls -1a | grep -v ^./$ | grep -v ^../$ ) ; cd ../.. ; done

단어 없이 명령을 다시 실행하기 전에 이것이 매우 좋아 보이는지 확인하십시오 echo.

의존하기 전에 철저히 테스트하고 싶습니다. 비슷한 일로 인해 ..삭제할 항목이 (재귀적으로) 일치하여 예상치 못한 대규모 데이터 손실이 발생했던 사례가 기억납니다 . 특히, cd $x실패했지만(권한 문제로 인해) 제대로 작동 cd ../..하고 rm -R상위 수준 디렉터리에서 실행되는 경우 잘못된 영역에서 반복적으로 삭제되기 쉽습니다. 이것이 바로 이것이 완전히 입증될 때까지 이것을 맹목적으로 믿는 것을 매우 주저하는 이유입니다.

이는 Debian에서 bash를 사용하여 테스트한 시스템에서도 작동했습니다. 이 시스템에서는 ls -1a표시 ...디렉토리 뒤에 슬래시가 옵니다. ls다르게 동작하는 다른 명령이나 셸이 있는 경우 약간의 조정이 필요할 수 있습니다.

따라서 진행하기 전에 반드시 수동 검토가 가능한지 여부를 고려하는 것이 좋습니다. (물론 적절한 백업이 준비되어 있는지 확인하십시오. 삭제된 사용자 삭제 스크립트가 있었는데 /users/$1다른 사람이 인수 없이 스크립트를 실행하고 구문이 표시되기를 원하는 상황에 대해 들었던 기억이 납니다. 데이터는 다행히도 , 이를 수행한 작업자는 명령이 얼마나 오래 걸리는지 놀라서 도움을 요청했고 백업이 쉽게 제공되어 성공적으로 악용할 수 있었습니다.)

관련 정보