【问题标题】:File Command 108k files: Too Many Args文件命令 108k 文件:参数太多
【发布时间】:2012-11-14 12:30:35
【问题描述】:

我有一个目录,里面有 108k 个文件。 我在 RHEL5 上使用 KSH shell

ls *
-dash_bin_ksh: ls: /bin/ls: cannot execute [Argument list too long]

似乎唯一有效的命令是 find 命令。

find .
file 1
file 2 
file n

我尝试使用带有 then exec 选项的 find 来运行文件命令,但我没有得到任何结果。

find . -exec file {}
find: missing argument to `-exec'

我错过了什么?我只想在此目录中的每个文件上运行 file 命令并输出到 file_output.txt

【问题讨论】:

    标签: linux file find ksh


    【解决方案1】:

    对于 find 的 exec,您必须以 \; 结束参数

    你也可以试试:

    find . -print0 | xargs -0 file
    

    xargs 的工作原理是采用其 STDIN 并将每个元素(行或分隔字符串)作为参数添加到给定的可执行文件中,以尽可能少地执行。参数列表由 --max-chars(取决于平台,最大 128Kib)分成组以供执行。

    -print0 添加空字符而不是新行,这使得带有空格的文件名安全。 -0 on xargs 用于识别空字符。

    -print0-0 是 GNU 扩展,可以在非 GNU 环境中删除,但会牺牲多功能性。

    xargs 还具有-I 选项,这使它更像find -exec,其中为每个元素运行可执行文件。

    感谢@glennjackman 对这个主题的深入了解。

    【讨论】:

    • 这将是同样的问题
    • @jordanm,不,这会起作用。这正是 xargs 的用途:对原始大列表的子集重复执行该命令。
    • 这确实需要 GNU 实现 find 和 xargs
    • @jordanm 我用 300K 文件检查过这个问题,可以用ls * 复制问题,但可以用find . | xargs ls
    • @glennjackman 感谢您的意见。我已经用你的观点更新了答案。但是,在给定的示例中,file 仅执行一次,而不是使用 -I 标志的重复执行。
    【解决方案2】:

    在命令末尾添加\;,例如find . -exec file {} \;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 2020-03-23
      • 1970-01-01
      • 2012-08-05
      • 2019-08-14
      • 2013-05-27
      • 2013-10-17
      • 1970-01-01
      相关资源
      最近更新 更多