查找和父文件夹的名字,不管排序唯一的文件名

问题描述 投票:4回答:2

所以,想象我有这样的目录结构:

~/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
linux bash
2个回答
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-

0
投票

如果所有的子目录的深度相同的,你可以为你的例子做这样的事情:

find -name "*" | sort -t '/' -k3 -u

如果有“C”目录的子目录“d”这将无法正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.