使用 basename 解析文件中保存的路径列表

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)

(请注意,我假设您的所有文件名都不包含换行符。)


rus*_*ush 9

为什么不使用内置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 '*'如果要列出所有文件,则无需指定。这是默认选项。


rah*_*hmu 5

这在 OSX 上似乎对我有用:

find ~ -type f -exec basename -a {} + | sort | uniq -d
Run Code Online (Sandbox Code Playgroud)

  • 这是有用的,请考虑给它投票。 (2认同)