如何使用 find 在多個檔案上執行腳本?

如何使用 find 在多個檔案上執行腳本?

所以基本上我需要找到一堆 .csv 文件,然後使用我在所有文件上編寫的腳本。我有

find . -type f -name "*.csv" | xargs ./extractdata

這是可行的,但只能處理一個文件,而不是我需要的所有文件。幫助?

答案1

它不起作用的原因是它xargs會在命令列中塞滿盡可能多的檔案。

因此,您的“extractdata”腳本將立即接收所有文件,並且可能僅處理第一個參數。即你有N個文件,你執行腳本與全部文件作為參數。

您需要使用-n參數:

... | xargs -n 1 ./extractdata

這樣你就有了 N 個文件,你可以執行 N 個腳本每個文件參數。

但是,這與使用find-exec選項運行幾乎完全相同(區別之一是您按找到的順序處理文件,而使用管道時,您可以在使用sortand/or傳遞後執行此操作grep):

find ... -exec /path/to/extractdata \{\} \;

您也許還可以使用並行執行腳本parallel:這次執行四個實例,可能根據資料、RAM 和硬體實現更有效率的處理:

... | parallel -n 1 -j 4 ./extractdata

(如果「extractdata」使用具有固定名稱的臨時文件,這不是一個好的做法,那麼並行執行的兩個或多個腳本將寫入彼此的臨時文件,從而弄亂事情)。

答案2

另一個選擇是fd工具:

fd csv -x ./extractdata

https://github.com/sharkdp/fd

答案3

有很多方法可以解決這個問題,例如,您可以要求find呼叫腳本,如下所示:

 $ find . -type f -name "*.csv" -exec your_script {} ;

{} 是每次找到的檔案名稱。

您可能需要轉義這些字元:

 $ find . -type f -name "*.csv" -exec your_script \{\} \;

相關內容