~/Parent
├── A
| ├── a.txt
| ├── b.txt
| └── b.tar
├── B
| ├── b.txt
| ├── c.txt
| └── c.tar
└── C
├── c.txt
├── d.txt
└── d.tar
如果我运行命令:
find ~/Parent -name *.txt | sort -f
我得到了结果:
~/Parent/A/a.txt
~/Parent/A/b.txt
~/Parent/B/b.txt
~/Parent/B/c.txt
~/Parent/C/c.txt
~/Parent/C/d.txt
正如您所期望的那样,但我希望得到的结果是:
~/Parent/A/a.txt
~/Parent/A/b.txt
~/Parent/B/c.txt
~/Parent/C/d.txt
有没有办法告诉uniq或另一个bash实用程序只获取唯一的文件名并忽略文件夹名称或告诉bash只给出排序列表中第一个文件名出现的方法?
编辑:
可能会有一些澄清.我需要处理比原始示例显示的更复杂的系统:
~/Parent
├── A
| ├── 45
| | └── Folder1
| | ├── a.txt
| | └── a.tar
| └── 46
| └── Folder1
| ├── a.txt
| └── a.tar
├── B
| ├── 12
| | └── Folder1
| | ├── b.txt
| | └── b.tar
| └── 13
| └── Folder1
| ├── b.txt
| └── b.tar
└── C
├── 99
| └── Folder1
| ├── c.txt
| └── c.tar
└── 100
└── Folder1
├── c.txt
└── c.tar
我想要的是:
~/Parent/A/46/Folder1/a.txt
~/Parent/B/13/Folder1/b.txt
~/Parent/C/100/Folder1/c.txt
如果我做:
find ~/Parent -name "*.txt" | sort -f -r
我明白了
~/Parent/C/100/Folder1/c.txt
~/Parent/C/99/Folder1/c.txt
~/Parent/B/13/Folder1/b.txt
~/Parent/B/12/Folder1/b.txt
~/Parent/A/46/Folder1/a.txt
~/Parent/A/45/Folder1/a.txt
我想过滤掉:
~/Parent/C/99/Folder1/c.txt
~/Parent/B/12/Folder1/b.txt
~/Parent/A/45/Folder1/a.txt
解决方法:
使用和不使用其目录打印文件名,仅在文件名上排序-u,然后删除文件名,以便仅显示完整路径.
$find ~/Parent -name '*.txt' -printf '%f\t%p\n' | sort -k1,1 -u | cut -f 2-
~/Parent/A/a.txt
~/Parent/A/b.txt
~/Parent/C/c.txt
~/Parent/C/d.txt
请注意,这将任意决定冲突,因为查找不按特定顺序打印文件名.如果要始终使用第一个或最后一个重复文件,请添加额外的排序或排序-r调用:
始终使用第一个:
$find ~/Parent -name '*.txt' -printf '%f\t%p\n' | sort | sort -k1,1 -u | cut -f 2-
总是使用最后一个:
$find ~/Parent -name '*.txt' -printf '%f\t%p\n' | sort -r | sort -k1,1 -u | cut -f 2-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。