
私の音楽ライブラリには非常に特殊なディレクトリ ツリーがあります。すべてのサブディレクトリを除いたすべてのアルバムをカウントしたいと思います。
たとえば、次のディレクトリ ツリーがあるとします。
/music/
/music/Davis, Miles/
/music/Davis, Miles/Kind of Blue/
/music/Davis, Miles/Tutu/
/music/Hendrix, Jimi/
/music/Hendrix, Jimi/Axis Bold As Love/
/music/Hendrix, Jimi/Electric Ladyland/
/music/Hendrix, Jimi/Electric Ladyland/Disk 1
/music/Hendrix, Jimi/Electric Ladyland/Disk 2
コマンドが「4」を返すようにしたいと思います。
つまり、基本的にはコマンドでアルバムの数を返すようにしたいのですが、"2" 個の解釈と "4" 個のアルバムが返された場合はボーナスポイントになります。
(さらに、解釈やアルバムもリストされていれば、ボーナスポイントは2倍になります。)
これを最も簡単に行うにはどうすればいいでしょうか?
答え1
4 つのアルバムを見るには:
$ ls -d1 music/*/*/
music/Davis, Miles/Kind of Blue/
music/Davis, Miles/Tutu/
music/Hendrix, Jimi/Axis Bold As Love/
music/Hendrix, Jimi/Electric Ladyland/
数えるには:
$ printf "%q\n" music/*/*/ | wc -l
4
ここでこの%q
形式が使用されるのは、改行を含むアルバム名が複数回カウントされるのを防ぐためです。
アーティストを見るには:
$ ls -d1 music/*/
music/Davis, Miles/
music/Hendrix, Jimi/
アーティストの数を数えるには:
$ printf "%q\n" music/*/ | wc -l
2
上記のコマンドは、 がmusic
現在のディレクトリにあることを前提としています。music
ディレクトリが実際に である場合は/music
、上記のすべてのコマンドで/
の前にを置きますmusic
。それ以外の場合は、 に到達するパスを の前に置きますmusic
。
答え2
サブディレクトリをすべて一覧表示するには、を使用しますfind
。次に、行ごとのスラッシュの数を数え、スラッシュが 3 つある頻度を報告します。
find -type d | sed s%[^/]%%g | grep -c ^///$
^//$
解釈の数を取得するために使用します。
答え3
ちょっとした「発見」の魔法を探しているのだと思います。
find /music -mindepth 2 -maxdepth 2 -type d | wc -l
コレクション内のアルバムの数が表示されます。
find /music -mindepth 1 -maxdepth 1 -type d | wc -l
アーティストの数を返す必要があります。