Joh*_*hnB 12 osx duplicate find filenames basename
我正在运行 Mac OSX 并尝试使用命令行来查找我拥有的同名文件的数量。
我尝试使用以下命令:
find ~ -type f -name "*" -print | basename | sort | uniq -d > duplicate_files
Run Code Online (Sandbox Code Playgroud)
它不起作用!当我执行以下操作时:
find ~ -type f -name "*" -print > duplicate_files
Run Code Online (Sandbox Code Playgroud)
然后duplicate_files 确实包含我所有文件的路径。所以我认为问题在于basename
- 它不接受标准输入。然后我尝试了以下方法:
basename $(find ~ -type f -name "*" -print) > duplicate_files
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。在互联网上搜索似乎并没有带来多少乐趣。任何想法最受欢迎。
Gil*_*il' 18
basename
操作它的命令行参数,它不从标准输入读取。
您不需要调用该basename
实用程序,并且最好不要:它所做的只是将最后一个之前的部分剥离/
,并且为每个条目调用外部命令会很慢,您可以使用文本处理实用程序代替。
find ~ -type f | sed 's!.*/!!' | sort | uniq -d
Run Code Online (Sandbox Code Playgroud)
跟踪文件的位置可能更有用。按名称排序可以更轻松地找到重复项,但sort
没有使用最后一个字段的选项。您可以做的是将最后一个/
分隔的字段复制到开头,然后进行排序,然后使用一些特别的 awk 处理来提取和呈现重复项。
find ~ -type f |
sed 's!.*/\(.*\)!\1/&!' | # copy the last field to the beginning
sort -t/ -k1,1 |
cut -d/ -f2- | # remove the extra first field (could be combined with awk below)
awk -F / '{
if ($NF == name) {
if (previous != "") {print previous; previous = ""}
print
} else {
previous = $0
name = $NF
}
'
Run Code Online (Sandbox Code Playgroud)
(请注意,我假设您的所有文件名都不包含换行符。)
为什么不使用内置find
功能只输出文件名:
find ~ -type f -printf '%f\n' | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
(假设 GNU find
)或至少是这样的:
find ~ -exec basename {} \; | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
basename
无法通过管道读取或一次处理多个文件。
附:-name '*'
如果要列出所有文件,则无需指定。这是默认选项。
这在 OSX 上似乎对我有用:
find ~ -type f -exec basename -a {} + | sort | uniq -d
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23010 次 |
最近记录: |