这是我名为 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