Linux Bash使用多个-name子句查找用户输入上的文件

时间:2017-04-28 20:34:44

标签: linux bash shell

我正在尝试通过创建tar ball来创建小实用程序来从远程主机收集日志文件,为简单起见,假设现在假设只显示基于用户输入的文件列表。

此命令正常

find $LOGS_DIR -maxdepth 1 -type f \( -name 'process1.log*' -o -name  'process2.log*' \) -exec echo 'FOUND_FILES:{}' ';'

如果我以编程方式想要根据用户输入更新-name子句,比如说用户输入是process3.log *,process4.log *,process5 * .log那么我的bash脚本应该生成find命令为

find $LOGS_DIR -maxdepth 1 -type f \( -name  'process3.log*'  -o -name  'process4.log*'  -o -name  'process5.log*' \) -exec echo 'FOUND_FILES:{}' ';'

这是我的代码段

...

for pattern in "${file_pattern_to_match[@]}"
do 
    if [ -z $final_pattern ];then
        final_pattern="-name $pattern"
        continue;
    fi
    final_pattern="$final_pattern -o -name $pattern"
done

#This will print final_pattern: -name  process3.log*  -o -name  process4.log* -o -name  process5.log*
echo "final_pattern:$final_pattern"

find $LOGS_DIR  -maxdepth 1   -type f  \( $final_pattern \)  -exec echo "FOUND_FILES:{}"  \; 

但问题是执行脚本find时评估为

find /x/path/logs  -maxdepth 1   -type f  \( -name process3.log.1 process3.log.2 -o -name process4.log.1 process4.log.2 \)  -exec echo "FOUND_FILES:{}"  \; 

但预期是

 find /x/path/logs  -maxdepth 1   -type f  \( -name "process3.log.*" -o -name process4.log.* -o -name process5.log.* \)  -exec echo "FOUND_FILES:{}"  \; 

因为变量被扩展了#34;发现"正在退出并出现错误

有人可以帮助我如何获得上述预期结果吗?

1 个答案:

答案 0 :(得分:1)

使用数组来保持每个参数的正确引用。

first=
for pattern in "${file_pattern_to_match[@]}"
do 
    if [ -z "$first" ]; then
        final_pattern=(-name "$pattern")
        first=1
    else
        final_pattern+=(-o -name "$pattern")
    fi
done

# Hacky
# first=
# for pattern in "${file_pattern_to_match[@]}"
# do 
#   final_pattern+=($first -name "$pattern")
#   first=-o
# done

find "$LOGS_DIR"  -maxdepth 1 -type f  \( "${final_pattern[@]}" \)  -exec echo "FOUND_FILES:{}"  \;