linux shell中的某些东西和`something`有什么区别?

时间:2014-02-20 09:57:38

标签: linux shell find

我希望使用find

递归地找到所有.pdf文件

所以我输入了find . -name *.pdf

输出很奇怪,它只包含当前目录中的所有pdf文件,子目录中的其他pdf文件被省略

然后我尝试了这个find . -name '*.pdf'

这一次,一切都很好。我得到了我想要的东西,我的意思是所有的pdf文件,包括那些位于子目录中的文件。

所以交易就出现了:find . -name *.pdffind . -name '*.pdf'

之间有什么区别

2 个答案:

答案 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,可能还有许多我不熟悉的),不同的引号意味着不同的东西。

从根本上说,引号会为你做两件事:

  1. 限制文本替换:您正在使用shell替换当前目录中*.pdf的所有PDF文件的引用。这是文本替换的一个例子。文本替换也可以使用变量名称进行 - 例如:

    bash$ MYVAR=test
    bash$ echo $MYVAR
    test
    bash$ echo '$MYVAR'
    $MYVAR
    

    将为您提供输出test,因为$MYVAR已替换为变量设置的值。

  2. 将空格覆盖为参数分隔符:让我们假装您有一个包含这些文件的目录

    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
    

    注意第一个示例如何显示两个文件file1file2,而第二个示例显示一个文件file1 file2。那是因为引号停止" "(单个空格)被用作参数分隔符。

  3. 最后一点说明:您的原始问题询问something'something'之间的区别。 something'something'"something"之间实际上存在差异,这一点毫无价值。考虑一下:

    bash$ MYVAR=test
    bash$ echo $MYVAR
    test
    bash$ echo '$MYVAR'
    $MYVAR
    bash$ echo "$MYVAR"
    test
    

    请注意'$MYVAR'"$MYVAR"之间的区别。 '(单引号)被认为是“强引号”,意味着其中包含的所有内容都是明确的。 "(双引号)是一个“弱引号”,它不会扩展*?,但会扩展变量名称和命令替换。

    Grymorie提供了大量有关引号的信息。玩得开心!