无论父文件夹名称如何,查找并排序唯一的文件名

时间:2019-02-07 14:28:50

标签: linux bash

因此,想象一下我有一个这样的目录结构:

~/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

2 个答案:

答案 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不会以特定顺序打印文件名,因此这将任意决定冲突。如果要始终使用第一个或最后一个重复的文件,请添加一个额外的sortsort -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”,则此方法将无效。