匹配不带引号的名称时的 find 命令行为

匹配不带引号的名称时的 find 命令行为

我正在寻找find带双引号和不带双引号的命令之间的差异。

我发现了一些奇怪的事情。我有两个文件:

  • xWrapper.java
  • YWrapper.java

还有一些是图案上的*Wrapper.java

我跑了

find . -name *Wrapper.java

它应该返回第一个与模式匹配的文件,因为该命令扩展为

find . -name xWrapper.java yWrapper.java ..

但结果是,我得到了该表单的所有文件。为什么它返回全部与该模式匹配的文件?

答案1

如果您在同一个目录中,则应该会收到一条错误消息:

~$ mkdir test
~$ cd test
~/test$ touch {X,Y}Wrapper.java
~/test$ find . -name *Wrapper.java
find: paths must precede expression: YWrapper.java
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

因为星号将被扩展,并且-name只需要一个参数。

如果您来自星号未扩展的地方:

~/test$ cd ..
~$ find test -name *Wrapper.java
test/XWrapper.java
test/YWrapper.java

由于星号现在不是展开(只要它与当前目录中的任何内容都不匹配),find将其视为“原样”,并将其用作通配符。

您应该将参数括-name在单引号中以避免这种依赖于上下文的行为:

~/test$ find . -name '*Wrapper.java'
./XWrapper.java
./YWrapper.java

答案2

您可以使用该or函数,因为-name它是一个字符串参数。

find . \( -name "xWrapper.java" -o -name "yWrapper.java" \)

或者你可以使用正则表达式来查找文件

find . -regex '.*\(x\|y\)Wrapper.java'

答案3

[max@localhost ~]$ touch 1file
[max@localhost ~]$ touch 2file
[max@localhost ~]$ touch 3file
[max@localhost ~]$ touch 4file
[max@localhost ~]$ touch 5file
[max@localhost ~]$ find -name "*file"
./4file
./2file
./Desktop/new file
./Desktop/DESKTOP/new file
./.bash_profile
./#file
./3file
./1file
./5file
./file
./file/file

这将匹配所有以file

[max@localhost ~]$ find . -name 'file*'
./file1
./.gconf/apps/file-roller
./Downloads/opera-10.60-6386.i386.linux/share/opera/unite/fileSharing.ua
./Downloads/opera-10.60-6386.i386.linux/share/opera/defaults/filehandler.ini
./Downloads/opera-10.60-6386.i386.linux/share/opera/styles/images/file.png
./.gnome2/file-roller
./.local/share/Trash/files
./file
./file/file2
./file/file

这将匹配所有以file

[max@localhost ~]$ find -name "1file"
./1file

这将仅匹配文件名1file

[max@localhost ~/avi]$ touch a
[max@localhost ~/avi]$ touch b
[max@localhost ~/avi]$ touch "a b"
[max@localhost ~/avi]$ ll
total 0
-rw-rw-r-- 1 max max 0 Jul 31 13:49 a
-rw-rw-r-- 1 max max 0 Jul 31 13:49 a b
-rw-rw-r-- 1 max max 0 Jul 31 13:49 b
[max@localhost ~/avi]$ find . -name a
./a
[max@localhost ~/avi]$ find . -name b
./b
[max@localhost ~/avi]$ find . -name a b
find: paths must precede expression: b
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] 
[expression]
[max@localhost ~/avi]$ find . -name "a b"
./a b

当文件名之间有空格(如“a b”)时,(“或')符号将很有用

相关内容