仅列出n级深的子目录


58

Festival将语音包数据存储在以下示例目录结构中:

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

在所有潜在的众多子目录中,最简单的单行ls打印(最好使用)打印出来的是什么?<voicepack name><language>

Answers:


80

我在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开关调用它。


大声笑,几乎完全相同的答案,伟大的思想和所有:)。
terdon

+1-对于那些在弄清是什么后被绊倒的-exec basename {}人,您能在这里解释吗?
user66001 2013年

@ user66001-让我知道这是否足够说明。
slm

@ user66001-如果它可以解决您的满意问题,您可以接受答案之一8
slm

1
find命令是我99%的时间所需要的。限制最大和最小是关键-我只做了最大。示例: find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h 查找按大小排序的最大目录
oligofren

23

最简单的是

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

Shell将其扩展到其所有子目录/usr/share/festival/voices/,然后扩展到这些子目录中每个子目录的内容。

如果您只想按照标题所示下降到特定级别,可以使用findGNU和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.

是的,就像看着镜子8
slm

+1你们俩如何获得2票很有趣。交叉表决各解释1个;)PS我想要目录名称,因此只需更改-type f为即可-type d解决此问题,对吧?还将就slm的目的等待slm的回应-exec basename {}
user66001 2013年

@ user66001是,-type d将找到目录。这basename是一个非常好的主意,它将仅打印名称并删除路径。假设您只想要名称,那是您应该做的。看看,man basenameman dirname
terdon

感谢terdon-对不起,您未将您的答案标记为答案。认为的SLM当前版本有更多的信息,对于那些需要它。
user66001 2013年

1
@ user66001首先,您绝对正确,slm的确更好。其次,您永远不要为不接受而道歉,只能有一个,那应该是您认为最好的一种:)。
terdon

6

接受的答案工作正常,但有些低效的,因为它产生一个新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

+1感谢您的回答Michael。我也可以在您的答案中看到这样做的好处,但是考虑到slm答案中的工作,我对切换接受的答案有两种看法。如果@slm看到此消息,并且在选择该消息时没有任何问题,我将返回此处更改接受的答案。
user66001

1
@slm的答案得到了很好的解释,并涵盖了find与任意外部命令一起使用的更一般的模式;对于内置的操作而言效率较低find。我曾考虑过在他的回答中添加评论,但这需要比我更高的声誉。无需更改您接受的答案,因为当前接受的答案是正确的,有充分的解释并且可以用作更一般情况的模式;我只想指出,对于这种特定情况,有一种更有效的方法。
迈克尔·亨利

0

TLDR;对于刚刚根据此问题的标题来到这里的人;要“仅列出n级深的子目录”:使用

find -maxdepth N

N任何数字在哪里。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.