音楽ファイルのないディレクトリを探す

音楽ファイルのないディレクトリを探す

私の~/Music/ディレクトリは実際にクリーンアップしたい「空の」ディレクトリでいっぱいです。 「空」と言ったのは、このディレクトリに実際にファイルが含まれているためです。いくつかの古いカバー画像ファイルやThumbs.db files

これらすべてのディレクトリを再帰的に削除したいと思います。これには音楽ファイルやその他のディレクトリは含まれません。

たとえば、 ~/Music/Audioslave/ にはアルバム名のあるディレクトリがたくさんありますが、音楽ファイルはありませんが、音楽ファイルがあるため削除したくありません。 oldalbumディレクトリに音楽ファイルや他のディレクトリがない場合は、~/Music/Audioslave/oldalbum/を削除したいと思います。

答え1

興味深い解決策はfindinsideを含みますが、許可された答えよりも安全です(私は個人的にbeまたはfindコマンドの出力を特に予防措置なしで解析するのが好きではありません)。次のコマンドはlsfind印刷内容のないフォルダ音楽ファイル(ここでは音楽ファイル拡張子はmp3flacまたは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スクリプトの2番目の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の場合です。

関連情報