Linux
find 命令中的 -exec 到 xargs 的轉換
我在腳本中使用以下命令對
dos2unix
從 Windows 複製到 Linux 的文件執行操作。文件很多,因此執行此操作需要相當長的時間。我在網際網路上搜尋以優化此發現,發現我們可以使用
xargs
withfind
而不是-exec
提高性能,但我正在努力將下面的轉換為使用 withxargs
: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 將只是一個額外的過程,因此會造成額外的時間損失。盡可能避免呼叫新流程。