所以基本上我需要找到一堆 .csv 文件,然後使用我在所有文件上編寫的腳本。我有
find . -type f -name "*.csv" | xargs ./extractdata
這是可行的,但只能處理一個文件,而不是我需要的所有文件。幫助?
答案1
它不起作用的原因是它xargs
會在命令列中塞滿盡可能多的檔案。
因此,您的“extractdata”腳本將立即接收所有文件,並且可能僅處理第一個參數。即你有N個文件,你執行一腳本與全部文件作為參數。
您需要使用-n
參數:
... | xargs -n 1 ./extractdata
這樣你就有了 N 個文件,你可以執行 N 個腳本一每個文件參數。
但是,這與使用find
該-exec
選項運行幾乎完全相同(區別之一是您按找到的順序處理文件,而使用管道時,您可以在使用sort
and/or傳遞後執行此操作grep
):
find ... -exec /path/to/extractdata \{\} \;
您也許還可以使用並行執行腳本parallel
:這次執行四個實例,可能根據資料、RAM 和硬體實現更有效率的處理:
... | parallel -n 1 -j 4 ./extractdata
(如果「extractdata」使用具有固定名稱的臨時文件,這不是一個好的做法,那麼並行執行的兩個或多個腳本將寫入彼此的臨時文件,從而弄亂事情)。
答案2
答案3
有很多方法可以解決這個問題,例如,您可以要求find
呼叫腳本,如下所示:
$ find . -type f -name "*.csv" -exec your_script {} ;
{} 是每次找到的檔案名稱。
您可能需要轉義這些字元:
$ find . -type f -name "*.csv" -exec your_script \{\} \;