특정 확장자를 가진 파일만 포함된 하위 폴더를 삭제하는 방법

특정 확장자를 가진 파일만 포함된 하위 폴더를 삭제하는 방법

모든 파일에 json과 같은 특정 확장자가 있는 경우 하위 폴더를 삭제하고 싶습니다. 비슷한 문제를 본 적이 있어요파일 형식이 포함된 디렉터리 찾기 및 복사. 미리 감사드립니다.

├── 20101018_DSC05369.JPG
├── f
│   └── some.jpg
├── f1
│   ├── f
│   │   └── some.json
│   ├── f4
│   │   ├── a.jpg
│   │   └── some.json
│   └── some.json
└── some.jpg


exp. result:
.
├── 20101018_DSC05369.JPG
├── f
│   └── some.jpg
├── f1
│   ├── f4
│   │   ├── a.jpg
│   │   └── some.json
│   └── some.json
└── some.jpg

답변1

#! /bin/bash
# recursively
shopt -s globstar || exit
# for every subfolder
for dir in **;do
      [[ ! -d $dir ]] && continue # if not directory then skip
      # SUBFOLDER name inspected
      echo "$dir"
      # count number of files in subfolder 
      NUMFILES=$(find "$dir" -type f | wc -l)
      # if non-empty folder
      if (( $(bc <<<"$NUMFILES > 0") )); then
      # if all files in folder have extension json, remove subfolder
              NUMJSON=$(find "$PWD/$dir" -iname '*.json' | wc -l)

              if (( $(bc <<<"$NUMFILES == $NUMJSON") )); then
                echo "rm -rf "$dir"" 
                rm -rf "$dir"
              fi
      fi
done

답변2

아래 하나의 라이너로 문제를 해결할 수 있습니다.

sudo find . -links 2 -exec sh -c '[ "$(ls -l \{} | grep -c '^-')" \
-eq "$(ls \{} | grep -c '\.json$')" ]' \; -print0 | xargs -0  echo rm -rf {} + 2> /dev/null \;

코드 설명:

sudo find . -links 2 

현재 디렉터리 내에서는 리프 디렉터리만 반환됩니다.

 ls -l \{} | grep -c '^-'

디렉터리의 일반 파일 수를 반환합니다.

 ls \{} | grep -c '\.json$'

json디렉토리에 있는 확장자를 가진 파일 수를 반환합니다.

sh -c '[ "$(ls -l \{} | grep -c '^-')" -eq "$(ls \{} | grep -c '\.json$')" ]'

jsonspwan은 디렉터리의 모든 파일에 확장명이 있으면 true를 반환하여 명령을 진행할 수 있도록 하는 하위 쉘입니다 .

rm -rf {} + 2> /dev/null

표준 오류를 /dev/null로 리디렉션하는 비어 있지 않은 디렉터리는 제거됩니다.

참고: 이 솔루션은 일반 파일이 포함되지 않은 발견된 폴더를 삭제합니다.

테스트를 수행하기 전에 데이터를 백업하십시오.

최상위 디렉터리에서 코드를 실행합니다.

테스트가 성공하면 에코를 제거합니다.

관련 정보