Find

通過並行化測試加速 find rm 命令

  • February 5, 2013

我想遞歸刪除行數小於10的目錄和子目錄中的所有文件,目前正在使用以下命令

find . -type f -name "*.txt" | while read; do     
(($(cat $THISFILE | wc -l) < 10)) && rm -vf "$THISFILE"; done 

我已經使用findwithxargs來並行化一些命令,但是在這裡,我不知道該怎麼做,因為測試與wc -l

有(或沒有!)我怎麼能更快xargs

發現自己不能並行執行(我不知道)。

xargs 可以做到這一點,使用 xargs 做到這一點的最簡單方法是將其包裝在 shell 腳本中。

但在此之前,您應該優化您的條件本身。cat除非實際連接文件,否則它是無用的。而且您不需要計算所有行來確定一個文件有 10 個或更多。所以我建議這樣的條件:

[ $(head -n 10 "$file" | wc -l) -lt 10 ] && echo rm "$file"

它最多只讀取前 10 行,如果文件沒有那麼多則刪除文件(rm 有點危險,所以我添加了echo這樣你可以先測試它)。與 cat 不同,head 實際上在達到 10 行後停止讀取,因此如果您的目錄中有超過 10 行的文件,這應該會大大加快處理速度。

像這樣包裹在一個shell腳本中:

#!/bin/bash

for file in "$@"
do
   [ $(head -n 10 "$file" | wc -l) -lt 10 ] && echo rm "$file"
done

您可以使用 find + xargs 進行多處理:

find . -type f -name "*.txt" -print0 | xargs -0 -P 4 -n 8 ./rm10lines.sh

-P 4四個程序)和-n 8(每次呼叫 shell 腳本 8 個參數)是範例,可以根據自己的喜好進行調整。如果您知道您有很多文件,請使用更大的 -n 以通過重新生成 shell 腳本來減少成本。

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