내 ~/Music/
디렉터리는 실제로 정리하려는 "빈" 디렉터리로 가득 차 있습니다. "비어 있다"고 말한 이유는 이 디렉토리에 실제로 파일이 포함되어 있기 때문입니다. 일부는 오래된 표지 이미지 파일이나 Thumbs.db files
.
이 모든 디렉토리를 재귀적으로 삭제하고 싶습니다.여기에는 음악 파일이나 기타 디렉터리가 포함되어 있지 않습니다.
예를 들어 ~/Music/Audioslave/에는 앨범 이름이 있는 디렉토리가 많이 있지만 음악 파일은 없지만 음악 파일이 있기 때문에 삭제하고 싶지 않습니다. oldalbum 디렉토리에 음악 파일이나 다른 디렉토리가 없으면 ~/Music/Audioslave/oldalbum/을 삭제하고 싶습니다.
답변1
흥미로운 해결책은 find
inside 를 포함하지만 허용되는 답변보다 안전합니다(저는 개인적으로 be 또는 find
명령의 출력을 특히 예방 조치 없이 구문 분석하는 것을 좋아하지 않습니다 ). 다음 명령은ls
find
인쇄내용이 없는 폴더음악파일(여기서음악파일 확장자는 mp3
, flac
또는 ogg
이어야 wav
하지만 m4a
자유롭게 추가할 수 있습니다.)
find . -depth -type d \! -exec sh -c 'find "$1" \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.ogg" -o -iname "*.wav" -o -iname "*.m4a" \) -type f | read a' _ {} \; -print
시스템에서 이것을 시도해야 하며 작동 방식에 만족하면 마지막을 다음 -print
으로 바꾸십시오.-exec rm -rfv -- {} \;
여기서 파일 이름이 사용되는 방식은 흥미로운 기호(예: 공백, 따옴표, 줄 바꿈, 후행 줄 바꿈, 선행 및 후행 공백 등)가 있는 파일 이름에 대해 이 방법을 100% 안전하게 만듭니다.
답변2
SO에서 다음과 같은 제목의 예를 찾았습니다.터미널 - .mp3 파일이 포함되지 않은 모든 폴더 삭제.
#! /bin/bash
find -depth -type d | while read -r D
do
v=$(find "$D" -iname '*.mp3')
case "$v" in
"" )
echo "$D no mp3"
# rm -fr "$D" #uncomment to use
;;
esac
done
예
견본.
.
|-- 1
| |-- 1.mp3
| `-- 1.txt
|-- 2
| `-- 2.mp3
|-- 3
| `-- 3.txt
|-- 4
| `-- 4.txt
|-- 5
| `-- 5.mp3
|-- 6
| `-- 61
| `-- 61.mp3
|-- 7
| `-- 71
| `-- 71.txt
`-- deletenomp3.bash
샘플 실행
실행하면 다음이 삭제됩니다.
$ ./deletenomp3.bash
./7 no mp3
./7/71 no mp3
./4 no mp3
./3 no mp3
기타 파일 형식
-name
스크립트의 두 번째 find 명령에 더 많은 매개변수를 추가하여 간단히 확장 할 수 있습니다 . 예를 들어 .wav
파일을 추가합니다.
v=$(find "$D" -iname '*.mp3' -o -iname '*.wav');
이는 *.mp3
"또는"을 의미합니다 *.wav
. 더 추가하거나 기타:
v=$(find "$D" -iname '*.mp3' -o -iname '*.flac' -o -iname '*.m4a');
더 많은 파일 형식이 있으면 대안을 사용하여 find
.
답변3
다음과 같이 시도해 보십시오(테스트되지 않음).
for dir in ~/Music/* ; do
found=false
# Add your music file extensions here.
for file in "$dir"/*.{mp3,wav} */ ; do
if ls "$file" > /dev/null 2>&1 ; then
found=true
break
fi
done
if ! $found ; then
# Remove 'echo' when you are ready.
echo rm -vrf "$dir"
fi
done
얼마나 많은 쉘이 와일드카드를 지원하는지 잘 모르겠습니다 */
. 적어도 Bash와 Zsh의 경우입니다.