回答:
私は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
スイッチを介して呼び出します。
-exec basename {}
が起こるかを考え出すときにつまずいた人のために、ここで説明できますか?
find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
サイズでソートされた最大のディレクトリを検索する
最も簡単なのは
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
のサブディレクトリにある)/usr/share/festival/voices/
ためのmindepth 2
(しかし、より深い3つのレベルがダウンしていないが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.
-type f
するだけで-type d
これを解決するはずですよね?また、目的に関するslmの応答を待ちます-exec basename {}
-type d
ディレクトリを検索します。これbasename
は非常に良いアイデアです。名前のみを出力し、パスを削除します。名前だけが必要だとすると、それがあなたがすべきことです。見ているman basename
ともman dirname
。
受け入れ答えは正しく動作しますが、それは新しい生成しますので、多少非効率的である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
find
、任意の外部コマンドで使用するより一般的なパターンをカバーしています。に組み込まれている操作では効率が低下しfind
ます。私は彼の答えにコメントを追加することを考えていましたが、それは私が持っているよりも多くの評判を必要とします。現在受け入れられている回答は正確で、十分に説明されており、より一般的な場合のパターンとして使用できるため、受け入れられた回答を変更する必要はありません。この特定の場合には、より効率的な方法があることを指摘したかっただけです。
TLDR; この質問のタイトルに基づいてここに来たばかりの人のために。「サブディレクトリをnレベルだけリストする」へ:使用
find -maxdepth N
どこN
にでも番号があります。