因此,想象一下我有一个这样的目录结构:
~/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
答案 0 :(得分:2)
仅在文件名上打印带有目录sort -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
请注意,由于find
不会以特定顺序打印文件名,因此这将任意决定冲突。如果要始终使用第一个或最后一个重复的文件,请添加一个额外的sort
或sort -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-
答案 1 :(得分:0)
如果所有子目录的深度相同,则可以为示例执行以下操作:
find -name "*" | sort -t '/' -k3 -u
如果“ C”目录中有子目录“ D”,则此方法将无效。