我正在运行以下命令以查找与“flash_drive_data”无关的所有文件/目录:
find . -not -path './flash_drive_data*' | grep "./*flash*"
我尝试过的一些事情让我感到困惑:
1. 当我运行上述命令时,我得到了一些“部分”命中(即它们与模式不完全匹配*flash*
。例如:
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/cli.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/signals.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/templating.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/sessions.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/tag.pyi
最后3/flas
突出显示。
2. 当我grep "*flash*"
用 just替换时grep "*"
,我希望得到 find 返回的所有文件,但我没有得到。为什么?然后,当我这样做时,grep "**"
我相信我得到了所有文件(或者至少我认为我做到了)。再说一遍,这是为什么呢?
3. 最后,我上面所做的目的是确保在运行时find . -not -path './flash_drive_data*'
我没有得到任何与 flash_drive_data 相关的信息。好像我做到了(正如我上面解释的那样,grep 出现了一些意想不到的行为)。但是,当我运行时:
find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +
我得到的输出包括:
./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/
所以 flash_drive_data 文件被包括在内。
您混淆了
*
Shell Filename Expansion和Posix Basic Regex的不同含义。在正则表达式中,
*
是它前面的字符的量词,因此h*
表示 0 次或多次出现h
。如果您想要“任意数量的任意字符”,请使用.*
.grep '*'
会寻找文字*
,因为它前面没有任何东西可以量化,而grep '**'
希望出现 0 次或更多次*
,所以一切都适合,因为 0 次出现的东西总是适合的。无论如何,您应该使用
find
with 参数-path "*/flash/*"
而grep
不是find
.这里的事情是
grep
使用正则表达式,而find -path
使用 shell glob 样式模式匹配。星号在这两者中具有不同的含义。正则表达式
./*flash*
首先匹配任意字符 (.
),然后匹配零个或多个斜杠 (/*
),然后匹配文字字符串flas
,然后匹配任意数量(零个或多个)h
字符。3/flas
匹配(零次h
),例如reflash
(零次/
)。你可以
grep flash
改用,因为它匹配输入中的任何地方,所以前导和尾随“匹配任何东西”部分是不必要的。或使用
find -path './*flash*' -and -not -path './flash_drive_data*'
由于星号的意思是“任意数量的前一个原子”,因此这里的定义并不明确。
grep
将其解释为字面星号,但实际上它应该是一个错误。请注意,
tar
递归存储文件,第一个输出find
是.
当前目录,因此所有内容都将被存储。您可能希望使用! -type d
withfind
从输出中排除目录,或者(更好)-exclude=PATTERN
查看tar
.