如何转义 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
、
中的匹配项进行排序
考虑。
我在转义任何文件名中的方括号时遇到一些问题。
我需要比较两个列表。 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
、 中的匹配项进行排序
考虑