在 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
是的,这就是全部事情。