我正在寻找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”)时,(“或')符号将很有用