从Bash中排除多行(版本:3.2.48)

时间:2012-06-29 10:04:37

标签: regex bash grep

想法是为目录中的所有文件(包括所有子目录)计算SHA256哈希值,但排除在另一个文本文件中指定的某些文件。

问题是如果我指定要排除的以下文件(参见下面的代码),则只排除其中一个,而不是两者。

这是我的代码:

while read line
do
    if [ $line_count -eq 0 ]
    then
        exclude_files=".*/$line$"
    else
        exclude_files="${exclude_files}\|.*/$line$"
    fi

    line_count=$(( $line_count + 1 ))
done < exclude-files.txt

find . -type f -print0 | xargs -0 shasum -a 256 | grep -v -P "${exclude_files}" > ~/out.txt

文件exclude-files.txt的内容:

Icon\\r
.DS_Store
--- empty line ---

文件Icon\r是用于更改文件夹图标的特殊文件,其名称包含CR。 (我在Mac OS X 10.7.4上)

2 个答案:

答案 0 :(得分:2)

这是因为您的变量\被识别为|的转义符号:

exclude_files="${exclude_files}\|.*/$line$"

您需要添加\以逃避\以使其正常工作:

exclude_files="${exclude_files}\\|.*/$line$"

此外,您在-P中使用了grep选项。在这种情况下,您无需转义|。因此,您根本不使用反斜杠。

您应该选择使用哪种方式:escape或-P。两者在一起它们将无法工作。

答案 1 :(得分:0)

如果文件名包含具有特殊含义的字符,那么

grep将不安全,这可能会有所帮助

cmd=(find . -type f \( )
while read line;do cmd=("${cmd[@]}" \! -name "$line" -a);done < exclude-files.txt
cmd[${#cmd[*]}-1]=\)
echo "${cmd[@]}" | cat -v
"${cmd[@]}" -print0 | xargs -0 shasum -a 256