我在使用任何文件名转义方括号时遇到一些问题。
我需要比较两个列表。 ls输出是第一个列表,第二个是ARQ02。
#!/bin/bash
exec 3< <(ls /home/lint)
while read arq <&3; do
var=`grep -e "$arq" ARQ02`
if [ "$?" -ne 0 ] ; then
echo "$arq" >> result
fi
done
exec 3<&-
抱歉我的英语不好。
答案 0 :(得分:2)
我必须假设我的解释是正确的。基于此,我可以提高oneliner轻松解决您的解决方案。我需要在这里做两个假设:你的文件名不包含回车符,你正在使用现代bash:
comm -23 <(printf "%s\n" * | sort) <(sort ARQ02)
bash <()
中的发出一个子shell并将stdout作为文件传递。 comm
是计算2输入流差异的命令。
详细解释,
comm
-23 # suppress files unique in ARQ02 and files in common
<(printf "%s\n" * | # print all the files in local folder with new line breaker
sort) # sort them
<(sort ARQ02)
有必要排序为comm
,只能逐步比较。
答案 1 :(得分:2)
您当前的问题是,您必须指示grep
使用 {将搜索字词解释为文字 而不是正则表达式{1}}选项:
-F
这样,恰好位于var=$(grep -Fe "$arq" ARQ02)
输出中的任何正则表达式元字符(例如ls /home/lint
和[
)仍将被视为文字并且不会打破]
调用。
也就是说,您的命令可以简化,例如直接使用grep
的输出作为搜索集要使用 ls /home/lint
选项
grep
的字符串:
-f
grep -Ff <(ls /home/lint) ARQ02 > result
是一个所谓的process substitution,简单地说,它将命令的输出呈现为(临时)文件,这就是<(...)
期望:包含-f
的搜索字词的文件。
或者,如果:
grep
行只包含 文件名完全匹配(部分)ARQ02
输出中的文件名,以及
您不介意排序或想要对存储在ls /home/lint
,