Rom*_*yov 12 linux ubuntu find
例如,我在某个目录中查找文件和目录:
ubuntu@example:/etc/letsencrypt$ sudo find . -name example.com*
./archive/example.com
./renewal/example.com.conf
./live/example.com
ubuntu@example:/etc/letsencrypt$
Run Code Online (Sandbox Code Playgroud)
我如何在上面的输出中标记它./archive/example.com和./live/example.com目录?
Edu*_*ani 35
打印文件类型和名称-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
Run Code Online (Sandbox Code Playgroud)
使用-printf假定 GNU find(findLinux 系统上最常见的实现)。
Kus*_*nda 24
查找两次:
echo 'directories'
find . -name 'example.com*' -type d
echo 'non-directories'
find . -name 'example.com*' ! -type d
Run Code Online (Sandbox Code Playgroud)
还要注意用于名称测试的模式的引用。如果没有引号,shell 会在调用find. 如果在failglobshell 中设置了shell 选项bash,或者未设置中的NOMATCHshell 选项,zsh则不匹配任何内容的未加引号的通配符模式将从 shell 生成错误,并且find根本不会被调用。
或者,只需在目录路径名的末尾输出一个斜杠(这是ls -p表示目录的方式):
find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)
Run Code Online (Sandbox Code Playgroud)
上面的find命令首先测试名称是否正确。如果是,并且它是一个目录,它会调用printf以输出结尾带有斜杠的目录的路径名。如果它不是目录,-print则用于按原样输出路径名。
使用 GNU find,该-exec printf '%s/\n' {} \;位可以由-printf '%p/\n'.
使用标准find,您还可以使用尽可能少-exec printf '%s/\n' {} +地调用外部printf实用程序,但这意味着目录可能会最后输出,或者至少是批量输出。
另一种选择是实际用于ls -p将目录与其他文件类型区分开来。使用ls -p,目录将与尾随/字符一起列出,就像上面一样。
find . -name 'example.com*' -exec ls -f -d -p {} +
Run Code Online (Sandbox Code Playgroud)
我在-f这里使用是为了避免ls对输出进行排序,并-d避免列出目录的内容。
您可以使用ls -F而不是在目录以外的文件类型上ls -p放置其他标记。例如,可执行文件的后缀是*,符号链接的后缀是@。
这两个-p和-F(和-f和-d)是标准选项的ls工具。
你可以这样使用file:
sudo find . -name "example.com*" -print0 | xargs -0 sudo file
Run Code Online (Sandbox Code Playgroud)
示例输出:
$ sudo find . -name "example.com*" -print0 | xargs -0 sudo file
./example.com. big file: ASCII text
./example.com-dir: directory
./example.com: empty
Run Code Online (Sandbox Code Playgroud)