如何传递变量来查找名称选项?

时间:2014-12-13 18:24:13

标签: bash shell

dupes.txt包含没有扩展名的文件字符串列表(通过比较没有扩展名的基本名称找到)。我可以通过以下几点来说明这一点:

files=`cat dupes.txt`; for f in "$files"; do echo "$f"; done

我正试图将“$ f”传递给find命令的名称选项

files=`cat dupes.txt`; for f in "$files"; do find . -type f -name "$f"; done

但没有任何回报。建议最受欢迎。换句话说,我想找到与文本文件中的模式匹配的所有文件。

我试过

find . -type f | fgrep -f dupes.txt

但这不会将find的输出限制为与dupes.txt中的文件字符串匹配的文件。

顺便说一句,我在OS X的bash shell中工作。

3 个答案:

答案 0 :(得分:3)

这是错误的:

files=`cat dupes.txt`; for f in "$files"; do echo "$f"; done

因为你引用了"$files",所以shell没有机会在空格上拆分变量。因此,循环内部"$f"将包含文件的全部内容。

要迭代文件的内容,请选择

之一
while IFS= read -r f; do ...; done < dupes.txt
# or
mapfile -t files < dupes.txt; for f in "${files[@]}"; do ...; done

这是一种创建模式的复杂方法,但您只需要调用find一次,这是一个巨大的胜利:

find_args=()
while IFS= read -r file; do
    find_args+=( -o -name "${file}*" )
done < dupes.txt
find . -type f \( "${find_args[@]:1}" \)

答案 1 :(得分:0)

试试这个:

files=$(cat dupes.txt)
for f in $files; do find . -type f -name "${f}*"; done

答案 2 :(得分:0)

while read i; do
    find -type f -name "${i}*"
done < dupes.txt