2

我有这个脚本

#!/bin/bash

path=$1

find "$path" -type f -exec sha1sum {} \; | 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 {} \; | awk '{ print $1 }' | sort | uniq -D -w 32

输出这个

parallels@mbp:~/bin$ duper ./dups
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16
ffc752244b634abb4ed68d280dc74ec3152c4826
ffc752244b634abb4ed68d280dc74ec3152c4826

当我把它改成$2它输出这个

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。这就是它不显示的原因。

4

3 回答 3

1

find将您的命令更改为:

find "$path" -type f -exec sha1sum {} \; | uniq -D -w 41 | awk '{print $2}' | sort

我将 移至uniq第一个过滤器,它只考虑前 41 个字符,旨在仅匹配sha1sum散列。

于 2019-04-05T12:51:26.403 回答
0

您可以通过管道获得相同的结果tr,然后cut

 echo '3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16  ./dups/dup1-1.txt' |\
      tr -s ' ' | cut -d ' ' -f 2

输出:

./dups/dup1-1.txt
  • -s ' 'on tr是为了压缩空间
  • -d ' ' -f 2oncut是输出由空格分隔的第二个字段
于 2019-04-05T12:42:01.630 回答
0

我喜欢用这样cut的东西。使用此输入:

3c8b9f4b983afa9f644d26e2b34fa3e03a2bef16  ./dups/dup1-1.txt

我会做cut -d ' ' -f 2应该返回的:

./dups/dup1-1.txt

我还没有为你的情况测试过。

编辑:Gonzalo Matheu 的回答更好,因为他确保在进行剪切之前删除输出之间的任何额外空格。

于 2019-04-05T12:44:42.047 回答