-find 命令中的 -exec 到 xargs 转换

-find 命令中的 -exec 到 xargs 转换

我在脚本中使用以下命令dos2unix对从 Windows 复制到 Linux 的文件执行操作。由于文件较多,因此执行此操作需要相当长的时间。

我在互联网上搜索了优化这一发现,发现我们可以使用xargswithfind而不是-exec来提高性能,但我正在努力将下面的转换为使用 with xargs

find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;

答案1

实际上要简单得多。您不需要调用 shell 也不需要使用,mv因为dos2unix如果您不给它标志,则已经修改了目标文件-n

find /path_to_files -type f -exec dos2unix -k -q -- {} +

-type f这样 find 只搜索常规文件,而不搜索目录。-q赋予标志,dos2unix以便它不会将信息性消息写入标准输出。我们使用而{} +不是{} \;这样 find 不会dos2unix为找到的每个文件调用一个进程,而是提供尽可能多的文件作为参数 ( dos2unix file1 file2 file3 ...)。

Xargs 只是一个额外的进程,因此会受到额外的时间惩罚。尽可能避免调用新进程。

答案2

创建一个脚本来~/bin处理文件列表,将其命名为doit,包含

#!/bin/bash
while [[ $# -ne 0 ]] ; do
    thisfile="$1"
    shift
    dos2unix -k -n "$thisfile" tmp_file
    mv tmp_file "$thisfile"
done

然后,

chmod +x ~/bin/doit

最后,

find /path/to/files -type f -print0 | \
    xargs -0 -r $HOME/bin/doit

man find xargs bash

相关内容