以递归方式仅查找唯一命名的文件

以递归方式仅查找唯一命名的文件

我在查找目录和子目录中唯一命名的文件时遇到了问题。文件的名称必须是唯一的,而不是 md5 值或内容。

uniq我已经设法通过此代码获取唯一文件列表,但只有名称,没有它们的位置(目录名称)。如果目录名称在字符串中,则无法正确排序或使用...

find . -type f -name "*" | xargs -I% basename % | sort -u

我得到的结果示例:

same_name
some_file
test_file

预期结果:

./dir1/same_name
./dir1/some_file
./dir3/test_file

这是目录树的一个例​​子,但它可以更大更深

.
├── dir1
│   ├── same_name
│   └── some_file
├── dir2
│   └── same_name
├── dir3
│   └── test_file
└── same_name

答案1

就像是

find . -type f -printf "%f:%p\n" | awk -F: '!seen[$1]++ {print $2}'

让 find 为你打印出基本名称,然后使用 awk 仅打印出路径名第一的看到基本名称的时间。

我使用冒号作为字段分隔符,使用换行符作为(默认)记录分隔符。两者都是有效的文件名字符。这个使用空字符作为记录分隔符(对于文件名不合法),并且更可靠

find . -type f -printf "%f\0%p\0" |
  awk -v RS='\0' '{basename=$0; getline} !seen[basename]++'

相关内容