n レベル深さのサブディレクトリのみを一覧表示

n レベル深さのサブディレクトリのみを一覧表示

Festival は、次のディレクトリ構造の例に音声パケットデータを保存します。

/usr/share/festival/voices/<language>/<voicepack name>

できるだけ多くのサブディレクトリの中で最も簡単な1行(使用するのに最適ls)は何を印刷しますか?<voicepack name><language>

答え1

私はFedoraを使用しており、これらの音声パッケージの場所は少し異なります。

$ ls /usr/share/festival/lib/voices/*/ -1 | grep -vE "/usr|^$"
kal_diphone
ked_diphone
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_rms_arctic_hts
nitech_us_slt_arctic_hts

次のように変更できます。

$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"

検索の使用

lsの出力をls解析するのは難しいので、この文脈で一般的に使用することは眉をひっくり返します。find次のコマンドを使用することをお勧めします。

$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
    -type d -exec basename {} \;
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_slt_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
ked_diphone
kal_diphone

検索と基本名の詳細

このコマンドは、ディレクトリに基づいて正確に2レベルの深さのファイルのフルパスリストを生成することによって機能します。

/usr/share/festival/lib/voices

リストは次のとおりです。

$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 
/usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_bdl_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_slt_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_jmk_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_clb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_rms_arctic_hts
/usr/share/festival/lib/voices/english/ked_diphone
/usr/share/festival/lib/voices/english/kal_diphon

しかし、私たちはこのディレクトリの最後の部分であるリーフノードが欲しいです。したがって、basename次のように解析できます。

$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts

これをすべてまとめると、findすべての2レベルのディープディレクトリをbasenameコマンドに渡すことができます。シンボルは、basename {}これらの基本名変換を実行します。 Findはスイッチを介して呼び出します-exec

答え2

最も簡単なこと

ls -d /usr/share/festival/voices/*/*

シェルはそれをすべてのサブディレクトリに展開し、/usr/share/festival/voices/各サブディレクトリの内容に展開します。

タイトルに示されている特定のレベルに降りて、findGNUやBSDなどのいくつかの実装を使用したい場合:

find /usr/share/festival/voices/ -mindepth 2 -maxdepth 3 -type d

-type dその後、サブディレクトリ内の3レベル以下の/usr/share/festival/voices/すべてのディレクトリを探します()。から:mindepth 2maxdepth 3man find

   -maxdepth levels
          Descend at most levels (a non-negative integer) levels of direc‐
          tories below the command line arguments.  -maxdepth 0
           means only apply the tests and  actions  to  the  command  line
          arguments.

   -mindepth levels
          Do  not apply any tests or actions at levels less than levels (a
          non-negative integer).  -mindepth  1  means  process  all  files
          except the command line arguments.

答え3

これ受け入れられた回答うまく動作しますが、サブディレクトリbasenameごとに新しいプロセスを作成するので、やや非効率的です。

find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
    -type d -exec basename {} \;

find可能であれば、作成プロセスにかかるコストを避けるために組み込み機能を使用することをお勧めします。findかなりさまざまな機能があり、-printf印刷物を修正するために使用できます。デフォルト-print のジョブはフルパスを印刷しますが、-printfフォーマット文字列を使用すると、印刷するパスの一部を選択できます。先行ディレクトリなしでパスのファイル名部分のみを抽出するには(前述のようにbasename )、フォーマット文字列はです%f。各ファイル名の後に改行文字を配置するには、\n次のようにします。

$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
    -type d -printf '%f\n'
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_slt_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
ked_diphone
kal_diphone

答え4

Bashを使っている人は、lsを使って簡単なものを見つけてください。

ls -d $PWD/*

~/.bash_aliasesまたは他の場所でエイリアスを生成するときは、単一​​引用符を使用する必要があります。

alias ldf='ls -d $PWD/*'

引用しない場合、シェルはlsを実行しようとします。

エイリアスを生成すると、二重引用符は$ PWD値を使用してエイリアスを生成します。

必要に応じて$(pwd)を使用できますが、bashが$ PWDを提供するときにサブシェルを作成することは意味がありません。

関連情報