6개의 하위 디렉터리가 있는 디렉터리가 있는데 그중 3개만 삭제하고 싶기 때문에 for 루프를 사용하여 이 3개 디렉터리에서 "cd"를 수행했지만 깊이가 2(최대 깊이, 최대 깊이)인 하위 디렉터리를 삭제하려고 합니다. 최소 깊이는 3개의 하위 디렉터리 내에서 2)입니다. 기본(기본은 3개의 하위 디렉터리 중 하나)에서 find 명령을 사용하지만 깊이 1(예상)에서 디렉터리를 찾습니다.
내 파일 구조는 다음과 같습니다.
/a/b/c/d/e
(a는 반복 중인 3개 디렉터리 중 하나입니다.)
다음은 도움/안내가 필요한 코드의 일부입니다.
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30
이것은 출력됩니다 -
./b/c
그래서 나도 그래아니요디렉터리를 삭제 /b
하고 해당 디렉터리 c
및 깊이 이하/내부 만 삭제하고 싶습니다.
이를 수행할 수 있는 방법이 있습니까? 아니면 디렉토리로 CD를 이동해야 합니까 b
?
답변1
rm -rf
찾은 디렉토리에서 실행 하도록 명령을 수정할 수 있지만 다음을 수행해야 합니다.매우 조심스럽다데이터 손실이 발생할 수 있기 때문입니다. 수행 방법은 다음과 같습니다.
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30 -exec rm -rf {} \;
언제나 그렇듯이 먼저 명령을 테스트해야 합니다 echo
.
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30 -exec echo "Deleting: {}" \;
그러면 삭제할 디렉터리가 인쇄되므로 실제로 항목을 삭제하기 전에 명령의 동작을 확인할 수 있습니다.
편집하다:비슷한 것을 찾고 계십니까? 다음 명령은 파괴적이지 않습니다.
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30 -exec sh -c 'cd "{}" && echo "Deleting contents of $(pwd)"' \;
이 명령파괴적이다!
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30 -exec sh -c 'cd "{}" && rm -rf *' \;
답변2
면책조항: 저는 현재 생가죽(rh)의 저자입니다.https://github.com/raforg/rawhide)
안녕하세요. 생가죽(rh)을 사용하면 다음을 수행할 수 있습니다.
rh -m2 -M2 -x 'rm -r %s' /a 'd && old(30*days)'
가장 먼저 확인해야 할 사항:
rh -m2 -M2 -x 'echo rm -r %s' /a 'd && old(30*days)'
-m2
동일합니다 -mindepth 2
.
-M2
동일합니다 -maxdepth 2
.
-x ...
일치할 때마다 주어진 쉘 명령을 실행합니다.
%s
일치하는 파일 경로(예: find {}
)로 대체됩니다.
/a
검색 경로입니다.
'd && old(30*days)'
최소 30일 d
동안 수정(항목 추가 또는 제거)되지 않은 디렉토리와 일치합니다( ).old(30*days)
old(month)
참고: mtime
디렉터리 확인에서는 각 디렉터리 자체만 고려하며 해당 내용은 mtime
고려하지 않습니다 . mtime
도 이렇습니다 find
.
답변3
도움이 되는 의견을 주신 모든 분들께 감사드립니다. 내 문제/문제를 내 개인용 컴퓨터에 재현할 수 있었습니다.
다음 명령을 사용하여 문제를 해결할 수 있었습니다.
코드 좀...
base2=$(pwd)
즉, /a
find $base2 -mindepth 2 -maxdepth 2 -type d -mtime +30 | xargs rm -R
이는 출력되지만 /a/b/c
지정된 대로 깊이가 2인 디렉터리만 삭제합니다. 즉, /c
명령이 실행된 후 /a/b
요청한 작업을 수행합니다.