例如,我在某个目录中查找文件和目录:
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
假定使用-printf
GNU ( 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
,或者未取消设置NOMATCH
shell 选项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
( -F
and-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 命令的格式。