Answers:
我在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 {}
是进行这些基名称转换的方式。查找通过-exec
开关调用它。
-exec basename {}
人,您能在这里解释吗?
find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
查找按大小排序的最大目录
最简单的是
ls -d /usr/share/festival/voices/*/*
Shell将其扩展到其所有子目录/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
但深度不超过(maxdepth 3
)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的目的等待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
任何数字在哪里。