如何在ls输出中转义方括号

时间:2016-10-26 01:34:18

标签: linux bash ls

我在使用任何文件名转义方括号时遇到一些问题。

我需要比较两个列表。 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<&-  

抱歉我的英语不好。

2 个答案:

答案 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

  • 中的匹配项进行排序

考虑HuStmpHrrr's helpful answer