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/
各サブディレクトリの内容に展開します。
タイトルに示されている特定のレベルに降りて、find
GNUやBSDなどのいくつかの実装を使用したい場合:
find /usr/share/festival/voices/ -mindepth 2 -maxdepth 3 -type d
-type d
その後、サブディレクトリ内の3レベル以下の/usr/share/festival/voices/
すべてのディレクトリを探します()。から:mindepth 2
maxdepth 3
man 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を提供するときにサブシェルを作成することは意味がありません。