find和有什么区别。并找到。-打印


27

之间有什么区别?

find .

find . -print

什么是-print真正做到?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt

Answers:


41

findutils find联机帮助页

如果未提供任何表达式,-print则使用该表达式(但是-print0无论如何您都应该考虑使用它)。

-print是一个find表达式。)

POSIX文件证实了这一点:

如果不存在表达式,则将-print用作表达式。

因此find .完全等同于find . -print; 第一个没有表达式,因此-print在内部添加。

有关帮助的解释-print在手册页中进一步介绍:

-print

真正; 在标准输出上打印完整的文件名,然后换行。如果将find的输出传递到另一个程序中,并且最有可能的是正在搜索的文件可能包含换行符,那么您应该认真考虑使用-print0选项而不是-print。有关如何处理文件名中异常字符的信息,请参见“非常规文件名”部分。


有点初学者水平的问题,但是您在说什么呢?这是正则表达式吗?
Rishi Prakash

2
@Rishi参见联机帮助页
史蒂芬·基特

20

-print是默认操作。一些find谓词被认为是与过滤条件条件相反的动作。例如,不是动作。是动作,即使它也可以用作条件。-type f-exec

采取的行动包括-print-exec-ok。一些find实现具有其他非标准动作谓词像-print0-printf-execdir-okdir-ls...

find files <some-predicates>

其中任何<some-predicates>包含动作均不等同于:

find files \( <some-predicates> \) -print

(请注意,如果有一些-o运算符,则上面的括号很重要)。

如有疑问,最好是-print显式使用(或-exec printf '%s\0' {} +(或-print0在可用的地方)使用,以便可以对输出进行后处理)。

默认-print操作由POSIX指定。一些旧的find实现需要一个显式的实现-print,但是如今通常在野外找不到这些实现

还要注意,某些find实现允许省略files,在这种情况下,它们默认情况下是搜索当前目录。对他们来说

find

相当于

find .
find . -print

但是,这不是标准的,因此最好避免。

在更为冗长(有用)的一端,某些find实现还允许将文件路径作为参数传递给-f选项,例如:

find -f "$file1" -f "$file2" -print

它们是唯一find允许将任意文件路径传递到的实现find。其他实现不能接受诸如!-print...之类的文件路径,因此find "$file" -print(甚至find -- "$file" -print)假定$file不是find谓词的名称(或第一种情况下的选项)。

不幸的是,这也不是标准的,也不是便携式的。


如果它是非标准的,最好避免使用,为什么要命名呢?
以撒

@Isaac,因为它们可以派上用场/可能是错字...
vonbrand

8

它们是相同的,它们都从当前目录写出整个目录层次结构。

POSIX查找文档

以下命令是等效的:

找 。

找 。-打印


4

在Linux中没有区别,但是-print如果要在屏幕上显示命令的输出,则需要其他系统(例如AIX)。


3
那将是非常旧的AIX版本。AIX 4.3 find不需要它。几十年来,AIX一直符合POSIX。
斯特凡Chazelas

3

多年来,find命令没有默认操作。一个常见的错误是忘记在查找命令中添加-print选项。到目前为止,我还是出于习惯将其键入。

但是在某个时候,它已被添加为默认操作,所以现在find .和它find . -print是等效的。


1

-print在执行其他操作时明确使用有时会很有用,这样在执行该操作时会显示文件名。

find . -print -delete

类似于

rm -rfv *

其中-print对应-v。如果不包括,-print则不会显示文件名。

为了使rm命令更加相似,顺便说一句,首先发出此Bash命令

shopt -s dotglob

这将使*匹配点(隐藏)文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.