
私の~/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
スクリプトの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の場合です。