"전송" 폴더가 있습니다. 이 전송 폴더에는 "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
다른 사람이 인수 없이 스크립트를 실행하고 구문이 표시되기를 원하는 상황에 대해 들었던 기억이 납니다. 데이터는 다행히도 , 이를 수행한 작업자는 명령이 얼마나 오래 걸리는지 놀라서 도움을 요청했고 백업이 쉽게 제공되어 성공적으로 악용할 수 있었습니다.)