![-find 命令中的 -exec 到 xargs 转换](https://linux22.com/image/179021/-find%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%9A%84%20-exec%20%E5%88%B0%20xargs%20%E8%BD%AC%E6%8D%A2.png)
我在脚本中使用以下命令dos2unix
对从 Windows 复制到 Linux 的文件执行操作。由于文件较多,因此执行此操作需要相当长的时间。
我在互联网上搜索了优化这一发现,发现我们可以使用xargs
withfind
而不是-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
。