列出文件夹内容并仅显示唯一值



有没有办法使用'ls'命令,然后通过管道输出,只显示唯一项?

以下是示例:

ls /dev/disk/by-id

ata-ST500DM002-1BD142_S2AFE0JP
ata-ST500DM002-1BD142_W2AEDMQK
ata-ST500DM002-1BD142_W2AEDMQK-part1
ata-ST500DM002-1BD142_W2AEDMQK-part2
ata-ST500DM002-1BD142_W2AEDMQK-part3
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804-part1
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804-part9
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EKK60289
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EKK60289-part1
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EKK60289-part9
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491-part1
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491-part9
ata-WDC_WD5003AZEX-00MK2A0_WD-WCC3F2HAD1XC
ata-WDC_WD5003AZEX-00MK2A0_WD-WCC3F2HAD1XC-part1
ata-WDC_WD5003AZEX-00MK2A0_WD-WCC3F2HAD1XC-part9

正如你在输出中看到的,除了一个项目外,所有项目都有序列号和一个-part#,但序列号是:

'ata-ST500DM002-1BD142_S2AFE0JP'

没有。我想做的是让输出只显示没有任何其他重复序列条目的resit。输出将只是唯一的序列号。

ata-ST500DM002-1BD142_S2AFE0JP

谢谢。

假设这些条目不包含换行符,则可以使用:

printf '%sn' /dev/disk/by-id/* |
awk '!/-part[0-9]*$/{arr[$0]; next} { sub(/-[^-]+$/, ""); delete arr[$0] } 
END { for (i in arr) print i }'
ata-ST500DM002-1BD142_S2AFE0JP

将grep与正则表达式一起使用:ls|grep-Ev'part.*$'

$ ls test
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804        ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804-part9  ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491-part1
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804-part1  ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491        ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491-part9
$ ls test | grep -Ev 'part.*$'
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491

最新更新