递归查找唯一的命名文件

Mat*_*a B 3 unix bash shell

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

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

find . -type f -name "*" | xargs -I% basename % | sort -u
Run Code Online (Sandbox Code Playgroud)

我得到的结果示例:

same_name
some_file
test_file
Run Code Online (Sandbox Code Playgroud)

预期结果:

./dir1/same_name
./dir1/some_file
./dir3/test_file
Run Code Online (Sandbox Code Playgroud)

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

.
??? dir1
?   ??? same_name
?   ??? some_file
??? dir2
?   ??? same_name
??? dir3
?   ??? test_file
??? same_name
Run Code Online (Sandbox Code Playgroud)

gle*_*man 5

就像是

find . -type f -printf "%f:%p\n" | awk -F: '!seen[$1]++ {print $2}'
Run Code Online (Sandbox Code Playgroud)

让 find 为您打印出基本名称,然后仅在一次看到基本名称时使用 awk 打印出路径名。

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

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