如何在“find”命令的输出中标记目录?

如何在“find”命令的输出中标记目录?

例如,我在某个目录中查找文件和目录:

ubuntu@example:/etc/letsencrypt$ sudo find . -name example.com*
./archive/example.com
./renewal/example.com.conf
./live/example.com
ubuntu@example:/etc/letsencrypt$ 

我如何标记上面输出中的目录./archive/example.com./live/example.com

答案1

使用以下命令打印文件类型和名称-printf "%y %p\n"

$ sudo find . -name 'example.com*' -printf "%y %p\n"
d ./archive/example.com
f ./renewal/example.com.conf
d ./live/example.com

假定使用-printfGNU ( Linux 系统上find最常见的实现)。find

答案2

查找两次:

echo 'directories'
find . -name 'example.com*'   -type d

echo 'non-directories'
find . -name 'example.com*' ! -type d

还要注意用于名称测试的模式的引用。如果没有引号,shell 将在调用之前尝试将字符串与当前目录中的名称进行匹配find。如果在 shellfailglob中设置了 shell 选项bash,或者未取消设置NOMATCHshell 选项zsh,则不匹配任何内容的不带引号的通配模式将从 shell 中生成错误,并且find根本不会被调用。


或者,只需在目录路径名末尾输出斜杠(这就是ls -p表示目录的方式):

find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)

上面的find命令首先测试名称是否正确。如果是,并且它是一个目录,它会调用printf输出目录的路径名,末尾带有斜杠。如果不是目录,-print则用于按原样输出路径名。

对于 GNU find,该-exec printf '%s/\n' {} \;位可以替换为-printf '%p/\n'.

使用 standard find,您还可以尽可能少地-exec printf '%s/\n' {} +调用外部printf实用程序,但这意味着目录可能会最后输出,或者至少是批量输出。


另一种选择是实际使用来ls -p区分目录与其他文件类型。使用ls -p,目录将带有尾随/字符列出,就像上面一样。

find . -name 'example.com*' -exec ls -f -d -p {} +

我在这里使用是-f为了避免对ls输出进行排序,并-d避免列出内容目录。

你可以使用ls -F而不是ls -p也放其他标记除目录之外的文件类型。例如,可执行文件将带有后缀*,符号链接将带有后缀@

-p( -Fand-f-d) 都是该实用程序的标准选项ls

答案3

你可以file这样使用:

sudo find . -name "example.com*" -print0 | xargs  -0 sudo file

输出示例:

$ sudo find .  -name "example.com*"   -print0 | xargs  -0 sudo file
./example.com. big file: ASCII text
./example.com-dir:       directory
./example.com:           empty

答案4

如果您想要一个更便携的选项,可以在没有 gnu 选项的情况下与 *nix 风格一起使用(例如 macOS),您可以通过如下方式-printf在目录路径末尾添加斜杠:ls

find . -name "example.com*" -exec ls -dF {} \;

例子:

$ sudo find . -name "example.com*" -exec ls -dF {} \;
./archive/example.com/
./renewal/example.com.conf
./live/example.com/

这也恰好是一种更适合进一步管道传输到更多 UNIX 命令的格式。

相关内容