显示同名文件的路径

显示同名文件的路径

在终端中使用此命令:

ls -R |sort | uniq -d | sort -r 

我可以显示位于运行目录和子目录中的同名文件列表。

但我也想展示他们的路径。

我试过

ls -R |sort | uniq -d | sort -r | xargs mdfind -name

或者

ls -R |sort | uniq -d | sort -r | xargs find . -name

但没有任何效果,即使我单独运行命令“ mdfind -name <filename>”或“ find . -name <filename>”,我也得到了预期的结果。

我可以将什么传送到我的命令来显示路径?

答案1

awk

find . | awk -F / '
   {t[$NF]=t[$NF] $0 ORS; c[$NF]++}
   END {for (k in t) if (c[k]>1) printf "%s", t[k]}
'

笔记:

  • 上述代码将路径名处理为以换行符终止的字符串;带有换行符的路径名将会破坏它。

    • 为了可靠地处理包含换行符的路径名,请将它们处理为以空字符结尾的字符串。为此,请将代码的第一行更改为find . -print0 | awk -v RS='\0' -F / '(不可移植)。awk仍将输出以换行符结尾的字符串(对于查看很有用),除非……
      • 为了使awk输出以空字符结尾的字符串(对进一步的可靠处理有用),请添加-v ORS='\0'到其选项中。代码的第一行将是:

        find . -print0 | awk -v RS='\0' -v ORS='\0' -F / '
        
  • 要以空行终止每组路径名,请更改printf "%s", t[k]printf "%s", t[k] ORS

  • ls解析(像你一样)的输出是不建议。解析(像我们所做的一样)的输出find是可以的(但要注意路径名中的换行符)。

答案2

即使我单独运行命令“ mdfind -name <filename>”或“ find . -name <filename>”,我也能得到预期的结果。

您正在使用以下命令运行filename,而 的主要目标xargs是同时运行带有尽可能多的参数的命令。因此它运行,find . -name one two three four ...这当然不是“find”的有效语法(每个命令都需要一个单独的命令-name,并用 分隔-o)。

如果您的 xargs 版本有该选项,请使用选项-n,如xargs -n 1 find . -name。另一个可能有效的选项是xargs -i find . -name {}


您也可以执行与这些命令相反的操作 - 从路径开始,然后按名称对它们进行分组,同时保留原始路径。例如,如果您有 Perl:

find . | perl -E '
    # gather stdin into a {name => [paths]} hashtable
    while (<>) { chomp; $name = (split"/")[-1]; push @{$items{$name}}, "$name $_"; }
    # draw the rest of the owl
    say for sort map @$_, grep scalar @$_ > 1, map $items{$_}, sort keys %items;
'

答案3

帖子 如何在 Linux 中生成带有其绝对路径的文件列表? 针对此问题有多个解决方案,其中一个可能适合您的情况。

Matthew Scharley 接受的答案是:“如果你给出find一个绝对路径,它就会打印绝对路径”。

您可以直接用 启动命令find "$(pwd)",然后与其他命令链接起来。

Jabir Ali 也给出了答案,其中提出了以下表述:

ls -R | xargs realpath

相关内容