仅根据部分文件名列出唯一文件

sea*_*fab 3 grep files

例如,我有很多文件看起来像下面的输出,我试图获取所有唯一文件名的列表,但忽略“-”右侧的字符。我已经尝试了ls -la | grep ....- | sort --unique一些变化,但这并没有给出我需要的输出

4855-00160880.psi
4855-00160980.ps
4855-00160980.psi
5355-00160880.ps
5355-00160880.psi
5355-00160980.ps
5355-00160980.psi
5855-00160880.ps
5855-00160880.psi
5855-00160980.ps
5855-00160980.psi
5855-00160A80.ps
5855-00160A80.psi
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望输出显示类似

4855
5355
5855
Run Code Online (Sandbox Code Playgroud)

Dop*_*oti 6

因为你真的不想解析ls,所以这应该可以解决问题:

find . -type f -maxdepth 1 -exec basename "{}" \; | cut -d'-' -f1 | sort -u
Run Code Online (Sandbox Code Playgroud)


tri*_*eee 5

这个怎么样?

printf "%-4.4s\n" ????-* | uniq
Run Code Online (Sandbox Code Playgroud)

Shell 按字母顺序扩展通配符并将结果作为参数传递给printf。格式字符串将每个参数截断为四个字符并添加一个换行符。现在剩下的就是删除相邻的重复项。

如果您不知道连字符前的位数,但您有想法,则可以遍历一些候选项:

for expr in '??' '???' '????' '?????'  # Quoted (!)
do
    printf "%-${#expr}.${#expr}\n" $expr-* |  # Unquoted!
    uniq
done
Run Code Online (Sandbox Code Playgroud)

这使用 Bash-only参数扩展 $[#var},它获得 的字符串长度$var

请注意引用通配符以避免在循环初始化中扩展的技巧,然后在循环内使用未引用的变量(在大多数其他情况下这是禁忌)。