Linux:列出文件名的唯一部分

Linux:列出文件名的唯一部分,linux,file,Linux,File,我有大约50K个文件是一个目录(linux操作系统),它们的命名约定为USER\u ID.ORACLE\u JOB\u ID.SEQUENCED\u NUMBER.pdf ls | awk 'BEGIN{FS="."}{ print $2 }' | sort | uniq > file.txt 我需要在文本文件中列出所有唯一的ORACLE\u作业\u ID。如何做到这一点 PS:忘了提到在同一个目录中有一些其他文件有不同的命名约定,我不得不避免它们 谢谢 示例: 1.6778390.完成

我有大约50K个文件是一个目录(linux操作系统),它们的命名约定为USER\u ID.ORACLE\u JOB\u ID.SEQUENCED\u NUMBER.pdf

ls | awk 'BEGIN{FS="."}{ print $2 }' | sort | uniq > file.txt
我需要在文本文件中列出所有唯一的ORACLE\u作业\u ID。如何做到这一点


PS:忘了提到在同一个目录中有一些其他文件有不同的命名约定,我不得不避免它们

谢谢

示例: 1.6778390.完成 2.o6778390.输出 3.AWRX_GBL_FAR1.98567432.4.dat.xml 4.AWRX\u GBL\u FAR1.34789214.4.pdf

ls | awk 'BEGIN{FS="."}{ print $2 }' | sort | uniq > file.txt
ls
获取当前目录中所有文件名的列表

awk
按字段分隔符“”拆分每个文件名,仅打印第二个字段

排序
对第二个字段进行排序

uniq
删除连续的相同行

编辑:如果您想将当前目录中的文件限制为.pdf格式,请使用:

find . -iname '*.pdf' | awk 'BEGIN{FS="."}{ print $3 }' | sort | uniq > file.txt
当当前目录中有许多pdf文件时,使用
ls*.pdf
会将参数溢出到
ls
,如错误所示,因为这相当于使用50K个不同的命令行参数调用
ls
,溢出
ARGV

,本着“有多种方法可以做到这一点”的精神下面是一个perl one liner,它在功能上相当于QWWQ的shell管道:

perl -le 'my %seen; print for sort grep !$seen{$_}++, map { (split /\./)[1] } <*>'
perl-le'my%seen;打印排序grep$看到{$\}++,映射{(split/\./)[1]}'

可以替换为任何全局表达式,例如,
仅对名称以
.pdf

结尾的文件进行操作这三个字段中的每个字段都允许哪些字符?例如,如果用户ID没有数字,ORACLE作业ID只有数字,这将简化解决方案。但是解决方案可能是
ls-1 | sed yada yada yada | uniq
。忘了提到同一目录中有一些其他文件具有不同的命名约定,我不得不避免它们。用户ID为字母数字,ORACLE作业ID和序号为numeric@Nitin如果我们要帮助您区分小麦和谷壳,我们需要在目录中查看所有命名约定的具体示例。@pilcrow在上面添加了有问题的示例。我认为您的awk脚本需要是
'BEGIN{FS=“.“}{print$2}'
。您的权利,正如我之前写的那样,它只是在对第一个文件进行预处理之后才更改FSline@Nitin处理这个问题的一个常用方法是将
ls*.pdf
更改为
find-maxdepth 1\(-type f-a-name'*.pdf'\)-print | sed's:^\./:'
@qwwqqwq这是什么
-iname
选项?另外,我认为,领先的
/
将意味着您现在需要在awk脚本中打印$3。
sort | uniq
非常常见,因此该功能是+1。从正面看,这将有效地流式处理目录,而不是一次读取所有目录。(甚至
find()
在我的系统上也会这样做。)在缺点方面,它还会
stat(2)
每个匹配条目。(
find()
对我来说也一样。)@pilcrow可能可以通过使用
opendir
readdir
来绕过这个问题,但是你必须自己进行全局搜索,额外的代码超出了我个人对一行代码的限制。