모든 파일에 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$')" ]'
json
spwan은 디렉터리의 모든 파일에 확장명이 있으면 true를 반환하여 명령을 진행할 수 있도록 하는 하위 쉘입니다 .
rm -rf {} + 2> /dev/null
표준 오류를 /dev/null로 리디렉션하는 비어 있지 않은 디렉터리는 제거됩니다.
참고: 이 솔루션은 일반 파일이 포함되지 않은 발견된 폴더를 삭제합니다.
테스트를 수행하기 전에 데이터를 백업하십시오.
최상위 디렉터리에서 코드를 실행합니다.
테스트가 성공하면 에코를 제거합니다.