使用像folderpath / *这样的通配符并不匹配folderpath /。为什么?

时间:2017-02-09 23:55:53

标签: sh wildcard gnu-coreutils

为什么还没有rm -fR folderpath/*删除文件夹路径。据我所知,通配符a*表示aa加上任意数量的字符。因此,folderpath/*表示folderpath/folderpath/加上任何字符。因此,该命令还应该执行rm -fR folderpath/,这也应该导致删除文件夹路径。

3 个答案:

答案 0 :(得分:1)

这是因为shell试图扩展您的通配符。试试ls

假设您有一个文件夹aaa,其中包含两个子文件夹bbb1bbb2,每个子文件夹都包含文件ccc1ccc2。看起来像这样:

└── aaa
    ├── bbb1
    │   ├── ccc1
    │   └── ccc2
    └── bbb2
        ├── ccc1
        └── ccc2

让我们创建它们进行测试:

mkdir -p aaa/bbb{1,2}
touch aaa/bbb{1,2}/ccc{1,2}

现在尝试以下命令显示的内容:

ls aaa        # first
ls aaa/       # second
ls aaa/*      # third

第一个命令会显示aaa的内容,即文件夹bbb1bbb2。第二个命令也是如此。

但是第三个命令扩展到

ls aaa/bbb1 aaa/bbb2

是的,它向您显示预期的bbb1bbb2的内容,它们都是ccc1ccc2的文件。

我想要展示的内容:您的shell会将*替换为给定目录中的所有文件(或文件夹)(因为所有文件和文件夹名称都匹配)并替换您的字符串{ {1}} aaa/*。但它扩展到aaa/bbb1 aaa/bbb2,因为那会占用aaa

答案 1 :(得分:1)

文档在这一点上并不清楚,但路径名扩展与普通模式匹配略有不同。匹配/后,必须至少匹配目录中的一个条目才能将整个模式视为匹配。因此,虽然模式/foo/*字符串 /foo/匹配,但它与路径 /foo/不匹配。

一种可能的解释是/foo/*匹配/foo/中的文件,如果没有文件,则匹配失败。但是,如果

,我希望这种解释更好
shopt -s dotglob
ls /foo/*

匹配/foo/./foo/..

考虑它的正确方法也许是路径名扩展考虑/ - 分隔的模式序列,每个模式都必须与某些匹配整个模式才能匹配。

答案 2 :(得分:0)

因为您只删除了文件夹路径中的内容" /"意味着。

使用

rm -rf folderpath

如果你想要一切都消失了。