regex 如何在bash脚本中只匹配完整的目录/文件名

k2fxgqgv  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(115)

我目前正在循环遍历一个目录,并检查一个数组,该数组包含所有我想匹配的字符串

matches=("README.md" "*.pdf" "item_output")

while IFS= read -r -d '' i; do
    if [[ ${matches[*]} =~ $(basename $i) ]]; then
        echo $i
    fi
done <<(find /home/user/somedir -print0)

字符串
但是,它不仅匹配名为“item_output”的文件夹,还匹配名为“item”的文件夹。
我该如何补救才能只匹配完整的字符串?

nxowjjhe

nxowjjhe1#

这取决于需求,但在bash中实现精确匹配的一种方法是循环遍历数组,并根据文件名检查每个元素,如下所示

matches=("README.md" "*.pdf" "item_output")

while IFS= read -r -d '' file; do
    basefile=$(basename "$file")
    for match in "${matches[@]}"; do
        if [[ $basefile = $match ]]; then
            echo "$file"
            break
        fi
    done
done < <(find /home/user/somedir -print0)

字符串
请记住,上述方法不适用于*.pdf通配符匹配。如果你想处理这个问题,你可以添加条件来处理glob模式:

matches=("README.md" "*.pdf" "item_output")

while IFS= read -r -d '' file; do
    basefile=$(basename "$file")
    for match in "${matches[@]}"; do
        if [[ $match == *"*"* && $basefile == $match ]] || [[ $basefile == $match ]]; then
            echo "$file"
            break
        fi
    done
done < <(find /home/user/somedir -print0)

iq3niunx

iq3niunx2#

简单而有效的方法是直接在find命令中使用globs:

find /home/user/somedir \
       -name 'README.md' \
    -o -name '*.pdf' \
    -o -name 'item_output'

字符串

ws51t4hk

ws51t4hk3#

我同意Fravadona的观点,让find在这里做繁重的工作是有意义的,因为它的能力远远超过了它。如果不能或不想硬编码参数,可以通过循环匹配并构建参数数组传递给find来动态生成参数。

#!/bin/bash
matches=("README.md" "*.pdf" "item_output")

find_args=( "-name" "${matches[0]}" )
for (( idx=1 ; idx < "${#matches[@]}" ; idx++ )) ; do
  find_args+=( "-o" "-name" "${matches[idx]}" )
done

find /home/user/somedir "${find_args[@]}"

字符串

相关问题