想法是为目录中的所有文件(包括所有子目录)计算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上)
答案 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