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

How to escape square brackets in a ls output

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

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

抱歉我的英语不好。

我必须假设我的解释是正确的。基于此,我可以提出一个 oneliner 轻松解决您的解决方案。我需要在这里做出 2 个假设:您的文件名不包含回车 return 并且您使用的是现代 bash:

comm -23 <(printf "%s\n" * | sort) <(sort ARQ02)

in 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只能递增比较。

您的直接问题是您必须 指示 grep 将搜索词解释为 文字 而不是常规表达式,使用 -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

  • 的输出中
  • 您不介意排序或想要对存储在result

  • 中的匹配项进行排序

考虑