透過管道傳遞輸入檔作為參數?

透過管道傳遞輸入檔作為參數?

我有兩個問題。我試圖透過管道傳遞文件作為參數,並且我試圖將該文件用作sh函數內的變數。

這是我的命令:

find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

在這裡,我的行是查找所有看起來像“ segment.something”的文件並將其傳遞到管道的右側。在 中someFunction.sh,我需要檔案名稱作為參數。假設正在輸入的檔案segment1

將列印出(例如)someFunction.sh的每一行。segment1

如何將輸出從管道的左側傳遞到右側,然後如何在內部呼叫它someFunction.sh

答案1

你的命令

$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

其效果是,最多someFunction.sh並行啟動 4 個 shell 腳本副本 ( -P 4)(舊副本完成後將立即產生新副本),每個副本都將一個檔案名稱作為其參數 ( -n 1)。

這意味著腳本的每次呼叫都將類似於

sh someFunction.sh segmentsomething

在腳本內部,shell 會將以下值放入位置參數(命令列上的參數) into$1$2$0通常包含腳本本身的名稱)。在您的情況下,$1將包含文件的名稱,其他將為空。

所以,在腳本中:

filename="$1"

echo "$filename"
cat "$filename"

就是這樣。現在,通常當人們用來find尋找檔案並將其檔案名稱傳遞給時,xargs會出現人們傾向於互相提醒的不穩定檔案名稱的問題,我也會在這裡這樣做。

find實用程式傳遞由空格分隔的檔案名稱。如果您的檔案名稱中含有空格,那就不好了,因為這會導致使用xargs正確的名稱呼叫腳本時出現問題。

因此,最好的做法是總是使用-print0withfind-0with xargs,這意味著檔案名稱不是用空格分隔,而是用nul字元 ( \0) 分隔。這使得它更加安全。

因此:

$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh

答案2

someFunction.sh假設在您的工作目錄中,您可以使用類似的東西。

find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh 

和允許名稱中包含空格的檔案(常見問題)-print0-0在我的someFunction.sh我有

#!/bin/bash
echo "Arg: " $1  
cat $1

它只是回顯文件名,然後寫入傳遞給的文件內容someFunction.sh

相關內容