我希望使用find
递归地找到所有.pdf文件所以我输入了find . -name *.pdf
输出很奇怪,它只包含当前目录中的所有pdf文件,子目录中的其他pdf文件被省略
然后我尝试了这个find . -name '*.pdf'
这一次,一切都很好。我得到了我想要的东西,我的意思是所有的pdf文件,包括那些位于子目录中的文件。
所以交易就出现了:find . -name *.pdf
和find . -name '*.pdf'
答案 0 :(得分:2)
是的,因为你发现引用在那里有所不同。
在没有引用*.pdf
的情况下,即使在查找运行之前,也会被shell glob扩展规则扩展,因此find命令仅显示该列表中的所有pdf文件。
换句话说,这个find命令:
find . -name *.pdf
与:
相同printf "%s\n" *.pdf
使用find的正确方法是:
find . -name '*.pdf'
答案 1 :(得分:0)
在Linux shell中(bash,csh,sh,可能还有许多我不熟悉的),不同的引号意味着不同的东西。
从根本上说,引号会为你做两件事:
限制文本替换:您正在使用shell替换当前目录中*.pdf
的所有PDF文件的引用。这是文本替换的一个例子。文本替换也可以使用变量名称进行 - 例如:
bash$ MYVAR=test
bash$ echo $MYVAR
test
bash$ echo '$MYVAR'
$MYVAR
将为您提供输出test
,因为$MYVAR
已替换为变量设置的值。
将空格覆盖为参数分隔符:让我们假装您有一个包含这些文件的目录
bash$ ls -1
file1
file1 file2
file2
如果您输入ls file1
,则可以获得file1
预期效果。同样,ls file2
会为您提供file2
。以下命令显示引号重写空格作为参数分隔符的重要性:
bash$ ls -1 file1 file2
file1
file2
bash$ ls -1 "file1 file2"
file1 file2
注意第一个示例如何显示两个文件file1
和file2
,而第二个示例显示一个文件file1 file2
。那是因为引号停止" "
(单个空格)被用作参数分隔符。
最后一点说明:您的原始问题询问something
和'something'
之间的区别。 something
,'something'
和"something"
之间实际上存在差异,这一点毫无价值。考虑一下:
bash$ MYVAR=test
bash$ echo $MYVAR
test
bash$ echo '$MYVAR'
$MYVAR
bash$ echo "$MYVAR"
test
请注意'$MYVAR'
和"$MYVAR"
之间的区别。 '
(单引号)被认为是“强引号”,意味着其中包含的所有内容都是明确的。 "
(双引号)是一个“弱引号”,它不会扩展*
或?
,但会扩展变量名称和命令替换。
Grymorie提供了大量有关引号的信息。玩得开心!