过滤 find 命令的结果,使其仅返回目录

过滤 find 命令的结果,使其仅返回目录

是否可以仅获取目录路径的 find 结果?使用带有某些选项的 find ,或者使用 grep 或其他一些实用程序将结果作为过滤器通过管道传输?

我以为类似的东西find | grep */$可能会起作用,但事实并非如此。从我“搜索”具有特定名称的文件夹的其他一些测试来看,似乎我得到了命中,folder_name$但没有命中folder_name/$。这似乎违反直觉。如何 grep 查找以 结尾的行/

答案1

是的,该-type d选项就是用于此目的的。

例如:

$ find /boot -type d
/boot
/boot/grub
/boot/grub/locale
/boot/grub/fonts
/boot/grub/i386-pc

这是手册页的相关部分:

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)

答案2

作为补充比雷埃夫斯零号的回答,如果您想包含解析为目录的符号链接:

  • 使用 GNU 查找:

     find . -xtype d
    
  • POSIXly:

     find . -exec test -d {} \; -print
    

    你可以优化到

     find . \( -type d -o -type l -exec test -d {} \; \) -print
    

如果您想在下降目录树时跟踪符号链接,您可以这样做:

find -L . -type d

它将报告目录和目录的符号链接。如果您不想要符号链接:

  • 使用 GNU 查找:

     find -L . -xtype d
    
  • POSIXly:

     find -L . -type d ! -exec test -L {} \; -print
    

zsh

print -rC1 -- **/*(ND/)   # directories
print -rC1 -- **/*(ND-/)  # directories, or symlinks to directories
print -rC1 -- ***/*(ND/)  # directories, traversing symlinks
print -rC1 -- ***/*(ND-/) # directories or symlinks to directories,
                          # traversing symlinks

相关内容