所以,想象我有这样的目录结构:
~/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给你了一个文件名的第一次出现在排序列表中?
编辑:一些澄清可能是为了。我需要处理更复杂的系统比原来的例子说明:
~/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
使用和不使用它的目录打印的文件名,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-
如果所有的子目录的深度相同的,你可以为你的例子做这样的事情:
find -name "*" | sort -t '/' -k3 -u
如果有“C”目录的子目录“d”这将无法正常工作。