如何使用文本文件中一行中的一组字符串执行查找命令

如何使用文本文件中一行中的一组字符串执行查找命令

这是我名为 fnames.txt 的文本文件的内容:

"SAMPLE_NIKE_856_20170703*"
"SAMPLE_ADIDAS_856_20170702*"
"SAMPLE_ANTA_856_20170630*"
"SAMPLE_JORDAN_856_20170627*"
"SAMPLE_CONVERSE_856_20170229*"

这是我名为 fn.sh 的脚本:

#!/bin/sh
#
#
while read LINE
do
    find -name "$LINE"
done < fnames.txt

它什么也不返回。

我想要发生的是,在每一行中,脚本将执行 find 命令,并将输出存储在另一个名为 files.txt 的文本文件中,例如:

第 1 行:

find -name "SAMPLE_NIKE_856_20170703*"

然后返回正在查找的文件名

./SAMPLE_NIKE_856_20170703_80_20_304_234_897.dat

第 2 行:

find -name "SAMPLE_ADIDAS_856_20170702*

然后返回正在查找的文件名

./SAMPLE_ADIDAS_856_20170702_56_98_123_245_609.dat

该脚本将继续执行,直到 find 命令执行完所有行。

答案1

原因是 shell 处理各种扩展和引用的顺序。如果直接输入

find . -name "foo*"

shell 将删除引号并foo*作为参数传递给find.

如果没有引号,shell 将对*第一个执行通配,可能会导致多个匹配,从而使find.所以使用引号是明智的。

但如果您read从文件中获取字符串,则变量将包含引号。现在,当你这样做时

> echo $LINE
"foo*"
> echo "foo*"
foo*
> find . -name $LINE

您会看到,与 的引号相反, 的引号$LINE不会被删除echo "foo*"。这是因为 shell 首先处理 的引号echo $LINE(没有引号),然后执行变量替换,因此该行将读取echo "foo*",但现在引号仍然存在。

因此您find将查找包含引号的文件。解决方案是去掉文件中的引号。那里不需要引用,完整的行将转到变量。

答案2

修改IFS为:

while IFS=\" read -r x LINE x; do
   find . -name "$LINE"
done < fnames.txt

这将**本质上去掉引号**,这将是您正常工作$LINE所需的。find它的作用是将读入的行拆分为引号,这样它们就不会出现在 $LINE 中。

答案3

我终于找到了答案。我只需要调用 fnames.txt 的完整文件路径到 /path/to/my/fnames.txt 因为我正在另一个目录中执行脚本。

#!/bin/sh
#
#
while read -r LINE
do
    find -name "$LINE"
done < /path/to/my/fnames.txt

输出:

./SAMPLE_NIKE_856_20170703_80_20_304_234_897.dat
./SAMPLE_ADIDAS_856_20170702_56_98_123_245_609.dat

相关内容