특정 개수 미만의 파일이 포함된 디렉터리를 삭제하는 방법

특정 개수 미만의 파일이 포함된 디렉터리를 삭제하는 방법

100개 미만(또는 200개 파일) 미만의 파일이 포함된 하위 디렉터리를 찾고 삭제하려면 어떻게 해야 합니까?

다음 명령을 찾아서 사용했지만 나열된 하위 디렉터리를 삭제하는 방법을 모르겠습니다. (이러한 폴더와 하위 디렉터리가 1000개 이상 있는데 수동으로 할 수는 없습니다.)

find . -maxdepth 5 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | awk '$NF<=10'

감사합니다!

답변1

아래에서 귀하의 질문에 답변했지만 이 명령을 사용할 때는 매우 주의해야 한다는 점을 강조하고 싶습니다. 원시 파일의 출력이 awk로 파이프됩니다 rm -rf. 이는 명령이 나열된 모든 폴더를 강제로 삭제함을 의미합니다.

대부분의 장소에서 이 프로그램을 실행하면 심각한 문제가 발생하거나 시스템에 돌이킬 수 없는 손상을 초래할 수 있으므로 이 프로그램을 실행할 위치에 대해 매우 주의해야 합니다.


find . -maxdepth 5 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; -print0 | awk '$NF<=10' | xargs rm -rf

원래 명령의 출력은 로 파이프되어 xarge rm -rf원래 xargs출력을 다른 프로그램(이 경우 )에 대한 인수로 변환합니다 rm.

rm사용 중인 두 스위치의 맨페이지 에서 가져왔습니다 .

       -f, --force
          ignore nonexistent files, never prompt

       -r, -R, --recursive
          remove directories and their contents recursively

직접 파이핑은 rm해당 형식의 파일 또는 폴더 이름을 수신할 것으로 예상하지 않으므로 작동하지 않습니다.

답변2

존재하다 zsh:

for d (**/*(Nod/))
  ()(($#)) $d/*(ND.Y100[100]) ||
  ()(($#)) $d/*(ND/Y1) ||
  rm -rf -- $d 

100개 이상의 일반 파일을 포함하지 않고 하위 디렉터리도 포함하지 않는 숨김되지 않은 디렉터리는 삭제됩니다. 이는 깊이 우선이므로 디렉터리에 삭제할 하위 디렉터리가 있는 경우 해당 디렉터리가 삭제될 가능성이 있습니다.

  • **/모든 수준의 하위 디렉터리와 일치
  • (Nod/)// (NDoN.[100]): (ND/Y1)다른 조건에 따라 glob을 추가로 한정하는 데 사용되는 glob 한정자:
    • N: nullglob: 일치하는 항목이 없으면 치명적인 오류로 처리하지 말고 glob이 null로 확장되도록 하세요.
    • D:dotglob: 숨겨진(ot) 파일을 무시하지 마세요 D.
    • od: order depth부터 먼저 (그들이 있는 지점보다 먼저 나옴)
    • oN: N귀찮게 o목록을 정렬할 필요가 없습니다.
    • /: 파일 형식 제한목차
    • .: 파일 형식 제한정기적인. ^/다음을 제외한 모든 유형의 파일을 고려 하도록 변경되었습니다 .목차대신에.
    • Y1/ Y100: 1/100 일치 후 검색을 중지하고 정렬도 하지 않습니다.
    • [100]: 100번째 일치 항목Y100[100] 만 선택합니다 . 100개 이상이면 결과를 파일에 저장하거나 그렇지 않으면 [100]목록에 대해 단독으로 사용하는 것보다 더 효율적인 방법으로 모든 일치 항목을 찾습니다. 정렬하고 100번째 항목을 선택합니다. 하나 .
  • (){body} argsargs: 매개변수를 사용하여 익명 함수를 실행합니다.
  • (($#))익명 함수의 본문은 산술 표현식이므로 표현식이 0이 아닌 숫자로 평가되면 true가 반환됩니다. 따라서 여기서 if $#익명 함수의 인수 개수는 0이 아닙니다.

답변3

아래 스크립트는 지저분하지만 효과적인 솔루션입니다.

콘텐츠가 삭제되므로 업무용 컴퓨터에 적용하기 전에 테스트 환경에서 이 스크립트를 실행하세요.

cd desired_directory
for i in `find . -maxdepth 1 -type d | grep "/"`
do
   cd $i;
   j=`echo \`ls -l | wc -l\` | bc`
   [ $j -lt "100" ] && echo "Lesser than 100 files/directories in $i"
   cd ../
done

echo여기서 문을 rm -rfor 로 바꿔야 합니다 mv.

관련 정보