我从 squashfs 中排除特定文件时遇到问题。我希望能够排除所有以 *.db 结尾的文件类型,但没有运气。
每当我运行带有排除文件的参数的 mksquashfs 命令时,它总是包含该文件。我已经尝试了该命令的许多不同变体。我的测试脚本如下:
#!/bin/bash
OPT="-regex -e '*.db' "
echo -e "Creating squashfs..."
mksquashfs test test.package ${OPT}
echo "Ran the following command: mksquashfs pf test.package ${OPT}"
echo -e "Uncompressing squashfs..."
mkdir pf_post
unsquashfs -f -d test_post/ test.package
echo
read -p "press any key to continue..."
rm test.package
rm -r test_post
测试目录的树如下。应该排除测试的两个实例.db但它似乎不起作用。
test
├── test
│ └── test.db
├── test.ab
├── test.cd
├── test.db
├── test.ef
├── test.gh
└── test.sh
将其切换到通配符部分修复了它。这排除了第一个.db文件,但第二个子目录更深的文件没有被排除在外。有没有办法告诉它排除所有".db"文件,而不仅仅是最低目录中的第一个文件?下面是排除第一种文件类型的代码。这两种解决方案仍然没有排除子目录".db"文件。
mksquashfs test test.package -wildcards -e '*.db'
mksquashfs test test.package -regex -e '.db$'
上述一些解决方案是从以下链接提供的,但我遇到了一个死胡同,我无法排除所有".db"文件。 https://askubuntu.com/questions/628585/mksquashfs-not-excluding-file
此信息包含在 Squashfs 发布自述文件中
除了通配符/正则表达式之外,排除文件还可以"锚定"或 "非锚定"。 定位排除是从 目录,而不是其他任何地方,非锚定排除在任何地方都匹配。 为 示例给定目录层次结构"A/B/C/A/B",定位排除 "a/b"将与目录层次结构根目录中的"a/b"匹配,但 它不会匹配目录"C"中的"/a/b"子目录,而 非锚定排除会。
非锚定排除
默认情况下,从顶级目录中排除匹配项,但它是 通常可用于排除源目录中任何位置的文件匹配项。 对于此非锚定排除,可以使用,通过在排除模式前面加上"... "
来指定(即,三个点后跟一个空格,然后是模式(。
例子:
mksquashfs example image.sqsh -wildcards -e '... *.gz'
排除源目录中任何位置与"*.gz"匹配的文件。 例如,这将匹配"example.gz"、"test/example.gz"和 "测试/测试/示例.gz"。
mksquashfs example image.sqsh -wildcards -e '... [Tt]est/*.gz'
排除在名为"Test"的目录中与"*.gz"匹配的文件,或 "测试"出现在源目录中的任何位置。
同样,使用扩展通配符,也可以进行负匹配。
mksquashfs example image.sqsh -wildcards -e '... !(*data*).gz'
排除源目录中任何位置与"*.gz"匹配的所有文件, 名称中带有"数据"的除外。