【问题标题】:find files returning basename and size查找返回基本名称和大小的文件
【发布时间】:2016-12-09 20:11:36
【问题描述】:

在 bash 中,我可以像这样获取找到的文件的基本名称(没有路径的名称):

find . -exec basename {} \;

我可以像这样得到文件大小:

find . -exec ls -l {} \; | awk '{print $5}'

但我需要用空格分隔基本名称和文件大小。

如何使用一个查找操作正确组合这两个命令? 此代码不起作用:

find . -exec basename {} \; -exec ls -l {} | awk '{print $5}' \;

awk: can't open file ;find: 
 source line number 1
-exec: no terminating ";" or "+"

我正在尝试创建一个快速的重复文件查找器。使用此列表,我将进行排序,然后使用 uniq 使用以下条件查找所有重复的文件:重复 = 相同的“基本名称”和相同的“大小”(没有 md5 检查)。

到目前为止,只是制作这个初始列表是我在语法上(也许是编程上)挂断的地方。如果您有更好的方法,请告诉我。它正在尝试使用最基本的 bash 命令使其工作,因此它可以在 linux 和 mac 上运行而无需安装任何东西。

【问题讨论】:

    标签: bash find duplicates size filenames


    【解决方案1】:

    GNU 系统

    对于 GNU 系统,使用此命令

    find . -printf '%k\t%f\n'
    

    获取每个文件的大小和基本名称的输出。

    • %k 以 kb 为单位打印文件大小
    • \t 文字制表符
    • %f 打印删除前导目录路径的文件名
    • \n 文字换行符

    OSX

    对于 OSX,请使用此命令,因为它本身不直接支持 -printf 参数。

    find . -exec bash -c 'printf "%s\t%s\n" $(stat -f " %z" "$1") "$(basename "$1")"' - {} \;
    

    【讨论】:

    • 感谢您的回复,但是 OSX 不使用 GNU 实用程序,因此它不适用于这个跨平台脚本。 find 命令仅限于 FreeBSD 使用的 find 版本中可用的内容。更多信息在这里:stackoverflow.com/questions/752818/…
    • 要回答你关于 osx 版本的问题,我必须将它作为一个实用程序部署给创建摄像机镜头驱动器的人,他们都在各种版本的 OSX 上工作,所以它必须完全独立于那个以及。这个想法是,在不安装任何其他东西的情况下,他们可以在驱动器的根目录中运行一个小型 bash 程序,该程序将快速解析驱动器上的所有文件并告诉它们是否存在任何文件名大小的欺骗。如果有这些类型的骗子,他们就会搞砸创建镜头驱动器(每个相机主控都应该是独一无二的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多