2

我在从 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

测试目录的树如下。应该排除 test.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- exclude-file

4

1 回答 1

4

此信息包含在 Squashfs RELEASE-README 中

除了通配符/正则表达式,排除文件可以是“锚定的”或“非锚定的”。锚定排除是从目录的根目录匹配,其他任何地方都没有,非锚定排除匹配任何地方。例如,给定目录层次结构“a/b/c/a/b”,锚定排除“a/b”将匹配目录层次结构根部的“a/b”,但不会匹配“/a /b" 目录“c”中的子目录,而非锚定排除会。

非锚定排除

默认情况下,从顶级目录中排除匹配项,但排除源目录中任何位置匹配的文件通常很有用。为此,可以使用非锚定排除,通过在排除前加上“...”来指定。

例子:

  1. mksquashfs 示例 image.sqsh -wildcards -e '... *.gz'

    在源目录中的任何位置排除与“*.gz”匹配的文件。例如,这将匹配“example.gz”、“test/example.gz”和“test/test/example.gz”。

  2. mksquashfs 示例 image.sqsh -wildcards -e '... [Tt]est/*.gz'

    排除在源目录中任何位置出现的名为“Test”或“test”的目录中匹配“*.gz”的文件。

    同样,使用扩展通配符,否定匹配也是可能的。

  3. mksquashfs 示例 image.sqsh -wildcards -e '... !(数据).gz'

    排除源目录中任何位置与“*.gz”匹配的所有文件,但名称中包含“data”的文件除外。

于 2017-08-08T01:32:19.457 回答