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
  • -s'
    ontr是为了压缩空格
  • 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
      将混合结果,您将无法知道哪个文件是彼此的副本。