我有一个换行符分隔的字符串列表。我需要遍历每一行,并使用包含通配符的参数。最终结果将找到的文件附加到另一个文本文件。以下是我迄今为止尝试过的一些内容:
cat < ${INPUT} | while read -r line; do find ${SEARCH_DIR} -name $(eval *"$line"*); done >> ${OUTPUT}
我已经尝试了很多eval / $()等变体,但我还没有找到让两个星号保留的方法。大多数情况下,我得到类似于*$itemFromList
的东西,但它缺少第二个星号,导致找不到文件。我认为这可能与bash扩展有关,但到目前为止我找不到任何运气。
基本上,需要为-name
参数提供类似于*$itemFromList*
的内容,因为该文件在我搜索的值之前和之后都有单词。
有什么想法吗?
答案 0 :(得分:0)
使用双引号防止将星号解释为shell的指令,而不是find
。
-name "*$line*"
因此:
while read -r line; do
line=${line%$'\r'} # strip trailing CRs if input file is in DOS format
find "$SEARCH_DIR" -name "*$line*"
done <"$INPUT" >>"$OUTPUT"
...或者,更好:
#!/usr/bin/env bash
## use lower-case variable names
input=$1
output=$2
args=( -false ) # for our future find command line, start with -false
while read -r line; do
line=${line%$'\r'} # strip trailing CR if present
[[ $line ]] || continue # skip empty lines
args+=( -o -name "*$line*" ) # add an OR clause matching if this line's substring exists
done <"$input"
# since our last command is find, use "exec" to let it replace the shell in memory
exec find "$SEARCH_DIR" '(' "${args[@]}" ')' -print >"$output"
注意:
bash
的shebang可确保扩展语法(如数组)可用。