在一个目录中查找文件夹,但不列出父目录。

24

我在不同的文件夹里遇到了困难,想要列出某个文件夹的内容,但又不包括该文件夹本身的名称。

例如:

root@vps [~]# find ~/test -type d
/root/test
/root/test/test1
然而,我希望它只显示/test1,就像例子一样。
你有什么想法?

1
如何看待 (cd ~/test && find *) - Jack Valmadre
如何让find命令不返回当前目录? - user598527
4个回答

41

简单并没有错。

find ~/test -mindepth 1

同样,这将产生相同的效果:

find ~/test/*

它与~/test/中包含的所有内容匹配,但不包括~/test本身。

顺便提一下,你几乎可以肯定地发现,find会抱怨-mindepth n选项在任何其他开关之后,因为排序通常很重要,但-(min|max)depth n开关影响整体行为。


3
你可以使用命令 '-maxdepth 1 -mindepth 1' 列出该文件夹下的所有文件和文件夹。 - kommradHomer
1
使用-mindepth是不错的选择,但不要使用通配符版本,因为如果超过最大命令参数大小,它可能会失败。 - Curt
“-mindepth”很好用,但我想保留没有子目录的文件夹。你知道怎么做吗? - danijar
1
“-mindepth 1”和添加“/*”之间至少有一个实际差别。Mindepth匹配顶级点文件,例如~/test/.env,而“/*”则不会。请参见此处的示例https://dev59.com/oWYr5IYBdhLWcg3wn7gc#28809662。 - Chad von Nau

7
你可以使用-execbasename来完成这个操作:
find ~/test -type d -exec basename {} \;

说明:

  • find ~/test -type d 部分会递归查找 ~/test 下的所有目录,这一点你已经知道了。
  • -exec basename {} \; 部分会在{}位置,即上一步骤的结果中代替的部分上运行basename命令。

5
我认为原帖作者想要在嵌套目录的情况下使用test2/test3而不是仅使用test3,但我不确定。;-) - Michael Krelin - hacker
替换\;+,代替使用xargs - Peter

3

如果你想要显示文件列表,而不是文件夹列表,则需要使用-type f而非-type d

或者,如果你想要显示排除父文件夹后的文件夹列表,则可以使用-mindepth 1find ~/test -type d -mindepth 1)。

现在看到你所编辑的内容,我认为你想要的可能是:

find ~/test -type d -mindepth 1 |cut -d/ -f3-

但我认为你需要更具体一些 ;-)


...然后它只会列出文件。-type d是用于目录的。我只是试图将其排除在外,就好像我在目录中一样。 - cbcp
@cbcp,是的,我意识到我可能误读了你(实际上,我的回答大多基于示例而非散文)。请查看更新后的答案。 - Michael Krelin - hacker

-1

我刚用sed修复了它。

find $BASE -type d \( ! -iname "." \)|sed s/$BASE//g

其中$BASE是初始文件夹名称。


如果任何子目录(或文件)恰好包含$BASE,sed也会将其删除...就像给出的示例一样... - sanmiguel
即使你修复了错误,使用sed也会过度杀伤力。 - kommradHomer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接