使用find获取目录名称列表


35

我知道我可以这样做以获得目录名称的列表:

find . -type d -maxdepth 1 

输出看起来像这样:

.
./foo
./bar

我更喜欢没有的清单./。有没有一种方法可以找到仅输出原始名称的方法?

我尝试将列表发送到stat进行格式化,但这只是给了我相同的结果:

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

所以您想foo bar ...全部集中在一条线上而没有./前面吗?
莱文,2012年

这是纯粹出于装饰/美学原因,还是您要对输出进行某些处理?
2012年

Answers:


42

使用GNU,find您可以使用以下-printf选项:

find . -maxdepth 1 -type d -printf '%f\n'

正如Paweł在评论中指出的那样,如果您不想列出当前目录,请添加-mindepth 1,例如:

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'

-printf最新的POSIX规范中找不到任何提及此选项的信息,我想知道它的便携性...
rahmu 2012年

@rahmu:已使用GNU find测试过。printfPOSIX未提及任何选项,并且其他一些find版本似乎不支持这些选项。GNU find可以安装在大多数地方,因此从某种意义上讲它是可移植的。
雷神

1
还可以添加-mindepth 1,如果你想摆脱的.
帕维尔Prażak

18

更新:

较短的替代方法:

 find . -maxdepth 1 -type d | cut -c 3-

将为您提供名称,每行一个,没有任何斜杠


4
@downvoter .. 没有解释的downvote 不会帮助任何人(OP,SO或我)。这是OP问题的功能解决方案。我很高兴纠正指出的错误或改善答案,但这需要建设性的反馈,而不仅仅是匿名的“单击”。
Levon 2012年

1
当您的答案包含解析的时候,我就是反对者ls。同时,我在另一个答案上发布了一个链接,说明为什么这是一个坏主意,此答案后来被删除了。当时只有2个答案,原因似乎很明显。我很高兴您指出了歧义,这是我的解释。作为记录,我同意我的赞成票,因为我同意你目前的回答。
rahmu 2012年

@rahmu在另一个问题中对您的不赞成票给出解释对我没有帮助(并且对您来说只是显而易见的)。另外,虽然这是一个更好的解决方案,但是我之前发布的解决方案效果很好(是的,我熟悉您的“请勿使用ls”链接-但这并不是在所有情况下都适用)。如果您有一个关于为什么我的初始解决方案无法奏效的反例,我很想知道(以便我可以从中学到一些东西),否则,您只是在发布一个链接而未提供任何建设性的内容。
莱文2012年

考虑\n在目录名称中有一个您不能使用cut检索它的名称(这是我对您进行低票表决时所做的事情)。在极少数情况下,ls行为举止不会危险,使用其他方式几乎总是更安全。
rahmu'8

9

使用GNU find,可以使用-mindepth来防止find与当前目录匹配:

find . -type d -maxdepth 1 -mindepth 1

由于您不是递归执行此操作,因此可以使用bash glob:

echo */

将尾随/添加到全局将导致仅目录匹配。


1
*/错过了点文件并包含符号链接。这可能是问题,也可能不是问题。
吉尔(Gilles)'所以

@Gilles-它总是会丢失符号链接,但是dotfiles取决于是否设置了dotglob。
jordanm 2012年

6

让我们sed删除这两个字符:

find . -maxdepth 1 -type d | sed -e 's/^\.\///'

6

我宁愿使用:

 find ./ -type d -maxdepth 1 -exec basename {} \;


0

在AIX中,参数“ maxdepth”不起作用。

总的来说,这对我有用:

find ./ -type d | cut -d"/" -f2 | sort -u


0

您要查找的称为basename,它忽略UNIX目录结构

下面的例子:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

它将为输出甚至排除dir路径,从而消除了cd 运行命令之前的必要性


一些附加信息:

我将-exec作为参数传递以代替查找|(管道)输出的另一条命令(避免第二条命令遍历每条输出行,尽管如此,根据输出的不同,它可以提高脚本的性能)

注意:find选项 不是位置性的(-maxdepth影响在其之前指定的测试以及在其之后指定的测试)。

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.