Tìm thư mục không có tệp nhạc


7

Thư mục của tôi ~/Music/thực sự chứa đầy các thư mục "trống" mà tôi muốn dọn dẹp. Tôi nói "trống rỗng" vì thư mục này thực sự chứa các tệp, một số chứa tệp ảnh bìa cũ hoặc Thumbs.db files.

Tôi muốn xóa đệ quy tất cả các thư mục không chứa bất kỳ tệp nhạc nào bên trong hoặc các thư mục khác bên trong.

Ví dụ ~ / Music / Audioslave / chứa rất nhiều thư mục có tên album và không có tệp nhạc, nhưng tôi không muốn xóa nó vì bên trong có các tệp nhạc. Mặc dù vậy, tôi muốn xóa ~ / Music / Audioslave / oldalbum / nếu thư mục oldalbum không có tệp nhạc cũng như các thư mục khác bên trong.


Theo dõi Q: (1) Bạn chỉ có một thư mục có nhiều thư mục khác chứa các tệp không phải là tệp nhạc? (2) ý bạn là bạn có một thư mục, với các thư mục chứa cả thư mục và tệp trong đó một số thư mục mang tệp nhạc còn những thư mục khác thì không?
slm

Xem giải pháp tôi cung cấp, nó có thể xử lý vấn đề thư mục lồng nhau.
slm

Phrasing của bạn vẫn bị tắt (ít nhất là với tôi) Tôi nghĩ điều bạn đang cố nói là bạn không muốn xóa bất kỳ thư mục nào có tệp mp3 trong đó hoặc chứa các thư mục lồng nhau có chứa các tệp mp3, phải không?
slm

đó chính xác là những gì tôi cần, nhưng cũng cho .flac và .m4a!
volotec

câu trả lời tôi cung cấp cho bạn điều này. Tôi cũng sẽ thêm các loại phương tiện đó vào nó.
slm

Câu trả lời:


4

Tôi tìm thấy ví dụ này trên SO, có tiêu đề: Terminal - Xóa tất cả các thư mục không liên kết tập tin .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

Thí dụ

Dữ liệu mẫu.

.
|-- 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

Chạy mẫu

Nếu tôi chạy nó, nó sẽ xóa như sau:

$ ./deletenomp3.bash 
./7 no mp3
./7/71 no mp3
./4 no mp3
./3 no mp3

Các loại tệp khác

Bạn chỉ có thể mở rộng điều này bằng cách thêm nhiều -nameđối số vào lệnh find thứ 2 trong tập lệnh. Ví dụ, để thêm .wavtệp:

 v=$(find "$D" -iname '*.mp3' -o -iname '*.wav');

Điều đó nói *.mp3HOẶC *.wav. Để thêm nhiều hơn hoặc những người khác:

 v=$(find "$D" -iname '*.mp3' -o -iname '*.flac' -o -iname '*.m4a');

Tôi chắc chắn khối này có thể được cô đọng nếu bạn có nhiều loại tệp hơn bằng cách sử dụng chuyển đổi thay thế find.


OK, nó đã làm việc! Cảm ơn sự giúp đỡ của bạn. Tôi muốn đưa ra câu trả lời của bạn nhưng vì tôi mới nên hệ thống sẽ không cho phép tôi làm điều đó vì tôi thiếu điểm danh tiếng :(
volotec

@volotec - bạn có thể đánh dấu nó là câu trả lời được chấp nhận 8-). Khi bạn nhận được hơn 15 điểm, bạn có thể bắt đầu nâng cấp.
slm

6

Một giải pháp hài hước liên quan đến findbên trong a find, nhưng theo cách an toàn hơn câu trả lời được chấp nhận (cá nhân tôi không thích phân tích cú pháp đầu ra của lệnh, lshoặc find, đặc biệt là không có biện pháp phòng ngừa). Lệnh sau sẽ in các thư mục mà không chứa bất kỳ âm nhạc tập tin (ở đây, âm nhạc phương tiện tập tin có phần mở rộng mp3, flac, ogg, wavhay m4a, nhưng cảm thấy tự do để thêm một số chi tiết):

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

Bạn nên thử điều này trên hệ thống của mình, khi bạn hài lòng với cách nó hoạt động, hãy thay thế trận chung kết -printbằng-exec rm -rfv -- {} \;

Cách các tên tệp được sử dụng ở đây làm cho phương pháp này an toàn 100% đối với các tên tệp có ký hiệu vui nhộn (ví dụ: dấu cách, trích dẫn, dòng mới, dòng mới, dấu cách hàng đầu và dấu, v.v.).


@volotec - như tôi đã chỉ ra trong câu trả lời của mình, nó có thể bị cô đọng, đây là cách thực hiện.
slm

0

Hãy thử một cái gì đó dọc theo dòng này (chưa được kiểm tra):

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

Tôi không chắc có bao nhiêu vỏ hỗ trợ toàn cầu */. Ít nhất Bash và Zsh làm.


1
Các thư mục không trống. Những gì anh ấy thực sự muốn là các thư mục không chứa '* .mp3' hoặc có thể '* .wav'.
jordanm

Vâng tôi biết. Điều đó là các thư mục tôi muốn xóa chứa các tệp xác nhận không phải là nhạc. Ví dụ tập tin Thumbs.db. Vì lý do đó, tôi không thể sử dụng tùy chọn -empty để tìm
volotec

Tôi đọc câu hỏi quá nhanh và bỏ lỡ ý chính. Tôi sẽ viết một câu trả lời mới.

Tôi đã thay thế câu trả lời của tôi.

Thực tế chạy kịch bản của bạn làm cho tôi nhận ra câu hỏi của tôi là không đầy đủ. Tôi sẽ chỉnh sửa nó, cảm ơn!
volotec
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.