我有一个awk脚本,我需要在其中计算哈希值,其中一些文件名出现在我正在处理的文件的第一个字段中。我目前正在使用:
command="sha1sum "$1
command | getline hash
不幸的是,该命令在被传送到getline
之前经历了shell扩展。对于包含空格或其他特殊字符的文件名,这会有问题。我怎样才能以允许任意字符的文件名的方式完成任务?
编辑:
某些示例文件名可能包含foo(2).txt
或x&y.mp3
我也会在这里包括整个程序,因为它不会太长。目的是从文本文件中获取文件名列表并搜索重复文件。
#take a list of filenames and compute sha1sums to look for duplicates
BEGIN {storage[0]=0}
{
command="sha1sum "$1
command | getline hash
split(hash, line)
#storage array has the sha1sum hash as a key and the filename as a value
#check each hash in storage, and report the duplicate if the current
#sum matches any encountered before
hash_exists=0
for (x in storage) {
if (x == line[1]) {
hash_exists=1
print("Duplicate found: " line[2])
}
}
if (hash_exists == 0) {
storage[line[1]]=line[2]
}
close(command)
}
答案 0 :(得分:3)
$ ll file\ with\ spaces
-rw-rw-r-- 1 foo foo 0 Mar 5 16:49 file with spaces
$ echo "file with spaces" | awk -F: '{
command="sha1sum \"" $1 "\"";
command | getline line
print line
}'
da39a3ee5e6b4b0d3255bfef95601890afd80709 file with spaces
答案 1 :(得分:1)
使用sha1sum
set -f;
前缀
$ touch f\*
$ nawk 'BEGIN {
command="set -f;sha1sum f*"
command | getline hash
print hash
}'
da39a3ee5e6b4b0d3255bfef95601890afd80709 f*