在终端中使用此命令:
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