查找:将模式命名为变量
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[@]}"
我想在变量中管理 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[@]}"