查找:将模式命名为变量

find: name pattern as a variable

我想在变量中管理 find 命令的文件名模式的琐碎情况:

/bin/bash
EXCLUDE="! \( -name "\"run*"\" -o -name "\"doc*"\" \)"
find . -maxdepth 1 -type f "$EXCLUDE"

期望找到所有不匹配 $EXCLUDE 模式的文件。

该方法不起作用,尽管相同的模式直接按预期工作。

在 shell 跟踪模式中,我观察到一些我认为是潜在根本原因的东西 - $EXCLUDE 变量在单引号之间进行评估:

set -x
find . -maxdepth 1 -type f "$EXCLUDE"
+ find . -maxdepth 1 -type f '! \( -name "run*" -o -name "doc*" \)'
find: paths must precede expression: ! \( -name "run*" -o -name "doc*" \)
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

替换的 $EXCLUDE 变量出现在以 + 开头的行中,而我的 find 命令不会 return 包含这些字符的任何内容:'! \( -name "run*" -o -name "doc*" \)' .

有没有办法删除那些不属于变量的引号,或者我遗漏了更大的东西?

将参数存储在数组中:

#! /bin/bash
EXCLUDE=( '!' '(' '-name' 'run*' '-o' '-name' 'doc*' ')' )
find . -maxdepth 1 -type f "${EXCLUDE[@]}"

这样可以避免引用错误。

这是 BashFAQ/050 -- 请改用数组:

EXCLUDE=( '!' '(' -name 'run*' -o -name 'doc*' ')' )

然后使用数组扩展语法

find . -maxdepth 1 -type f "${EXCLUDE[@]}"