음악 파일이 없는 디렉토리 찾기

음악 파일이 없는 디렉토리 찾기

~/Music/디렉터리는 실제로 정리하려는 "빈" 디렉터리로 가득 차 있습니다. "비어 있다"고 말한 이유는 이 디렉토리에 실제로 파일이 포함되어 있기 때문입니다. 일부는 오래된 표지 이미지 파일이나 Thumbs.db files.

이 모든 디렉토리를 재귀적으로 삭제하고 싶습니다.여기에는 음악 파일이나 기타 디렉터리가 포함되어 있지 않습니다.

예를 들어 ~/Music/Audioslave/에는 앨범 이름이 있는 디렉토리가 많이 있지만 음악 파일은 없지만 음악 파일이 있기 때문에 삭제하고 싶지 않습니다. oldalbum 디렉토리에 음악 파일이나 다른 디렉토리가 없으면 ~/Music/Audioslave/oldalbum/을 삭제하고 싶습니다.

답변1

흥미로운 해결책은 findinside 를 포함하지만 허용되는 답변보다 안전합니다(저는 개인적으로 be 또는 find명령의 출력을 특히 예방 조치 없이 구문 분석하는 것을 좋아하지 않습니다 ). 다음 명령은lsfind인쇄내용이 없는 폴더음악파일(여기서음악파일 확장자는 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의 경우입니다.

관련 정보