Linux

find 命令中的 -exec 到 xargs 的轉換

  • August 30, 2020

我在腳本中使用以下命令對dos2unix從 Windows 複製到 Linux 的文件執行操作。文件很多,因此執行此操作需要相當長的時間。

我在網際網路上搜尋以優化此發現,發現我們可以使用xargswithfind而不是-exec提高性能,但我正在努力將下面的轉換為使用 with xargs

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

創建一個腳本~/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

它實際上要簡單得多。你不需要呼叫 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 將只是一個額外的過程,因此會造成額外的時間損失。盡可能避免呼叫新流程。

引用自:https://unix.stackexchange.com/questions/605930