如何循环遍历文件的行并查找与每行匹配的文件?

如何循环遍历文件的行并查找与每行匹配的文件?

在 BASH shell 中,我想获取文件的行(例如模式.txt)并在我的系统上查找名称包含文件每一行中的模式的文件。所以,我有以下 for 循环

for pp in `cat pattern.txt`; do find ./ -iname "*${pp}*" -print0; done

如果第一行在,则找不到任何文件模式.txt确实存在。那么如何修复上面的命令行呢?

注意:我的文件中的每一行仅包含字符 [a-zA-Z]。

答案1

这是一种安全且不受 Windows 保护的方法,用于查找从文件中检索到的一堆文件名模式。我选择的方法是将模式列表处理为表达式find

find_expression=$(<pattern \
    sed -e 's/^/-o\n-iname\n*/' \
        -e 's/\r\?$/*/' |            # turn each pattern into -o -iname *foo*
    tail -n +2)                      # remove spurious initial -o
set -f                               # turn off globbing
IFS='
'                                    # split only at newlines
find . \( $find_expression \) -print0
set +f; unset IFS                    # restore defaults

答案2

尝试这个:

#!/bin/bash

while IFS= read -r pp; do
  find . -iname "*${pp}*" -print0
done < /path/to/pattern.txt

不知道你为什么想要-print0,但我还是把它留在了里面。也许您正在尝试将其通过管道传输到xargs?

答案3

@SiegeX 给出的答案是可行的,但如果您的模式文件中有很多文件,这可能会变得缓慢且笨拙。通过使用不同的工具,您可能会获得更好的性能,如下所示:

find . | grep -f pattern.txt

是的,这就是全部事情。

相关内容