Bash 获取由两个空格分隔的输出的第二部分
我有这个剧本Bash 获取由两个空格分隔的输出的第二部分,bash,Bash,我有这个剧本 #!/bin/bash path=$1 find "$path" -type f -exec sha1sum {} \; | sort | uniq -D -w 32 #!/bin/bash path=$1 find "$path" -type f -exec sha1sum {} \; | awk '{ print $1 }' | sort | uniq -D -w 32 它的输出是: 3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
#!/bin/bash
path=$1
find "$path" -type f -exec sha1sum {} \; | sort | uniq -D -w 32
#!/bin/bash
path=$1
find "$path" -type f -exec sha1sum {} \; | awk '{ print $1 }' | sort | uniq -D -w 32
它的输出是:
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16 ./dups/dup1-1.txt
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16 ./dups/dup1.txt
ffc752244b634abb4ed68d280dc74ec3152c4826 ./dups/subdups/dup2-2.txt
ffc752244b634abb4ed68d280dc74ec3152c4826 ./dups/subdups/dup2.txt
现在我只想在数组中保存最后一部分(路径)。
当我在排序之后添加这个时
| awk -F " " '{ print $1 }'
我将此作为输出:
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
ffc752244b634abb4ed68d280dc74ec3152c4826
ffc752244b634abb4ed68d280dc74ec3152c4826
当我将$1
更改为$2
时,我什么也得不到,但我想获得文件的路径
我该怎么做
编辑:
这个剧本
#!/bin/bash
path=$1
find "$path" -type f -exec sha1sum {} \; | sort | uniq -D -w 32
#!/bin/bash
path=$1
find "$path" -type f -exec sha1sum {} \; | awk '{ print $1 }' | sort | uniq -D -w 32
输出此
parallels@mbp:~/bin$ duper ./dups
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
ffc752244b634abb4ed68d280dc74ec3152c4826
ffc752244b634abb4ed68d280dc74ec3152c4826
parallels@mbp:~/bin$ duper ./dups
parallels@mbp:~/bin$
当我将其更改为$2
时,它会输出此值
parallels@mbp:~/bin$ duper ./dups
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
ffc752244b634abb4ed68d280dc74ec3152c4826
ffc752244b634abb4ed68d280dc74ec3152c4826
parallels@mbp:~/bin$ duper ./dups
parallels@mbp:~/bin$
预期产出
./dups/dup1-1.txt
./dups/dup1.txt
./dups/subdups/dup2-2.txt
./dups/subdups/dup2.txt
目录中有些文件彼此不重复。例如nodup1.txt和nodup2.txt。这就是它不显示的原因。您可以通过管道输送到
tr
,然后cut
,获得相同的结果:
echo '3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16 ./dups/dup1-1.txt' |\
tr -s ' ' | cut -d ' ' -f 2
产出:
./dups/dup1-1.txt
ontr是为了压缩空格-s'
上的cut
将输出由空格分隔的第二个字段-d'-f2
- 我喜欢用
cut
来处理这样的东西。通过此输入:
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16 ./dups/dup1-1.txt
我会做cut-d'-f2
,它应该返回:
./dups/dup1-1.txt
我还没有为你的案子测试过
编辑:Gonzalo Matheu的答案更好,因为他确保在执行剪切之前删除输出之间的任何额外空格。将
查找
命令更改为:
find "$path" -type f -exec sha1sum {} \; | uniq -D -w 41 | awk '{print $2}' | sort
我移动了
uniq
作为第一个过滤器,它只考虑了前41个字符,目的是只匹配sha1sum
散列。删除-F“”
参数并使用$2
@accdias当我这样做时,它仍然没有输出任何东西。我只是测试了与您所做的完全相同的事情,这里的输出是,正如预期的那样,文件名。我测试了您的代码是否使用-F和works(linux+bash 4.3),现在我看到了您描述的相同效果。这是由uniq引起的。卸下它并再次测试。我不知道它到底出了什么问题,但正是它造成了问题。请记住,命令末尾的sort
将混合结果,您将无法知道哪个文件是彼此的副本。