我想要做的是從索引檔案中讀取檔案名串列,然后將每個列出的檔案復制到另一個目錄,但是我在正確地將 xargs 和 cp 串在一起時遇到了一些麻煩。
head -n 150 ../indexes/index.txt | xargs cp ~/path/to/destination/
這給出了以下錯誤:
cp: target 'foo.txt': Not a directory
index.txtfoo.txt中列出的第 150 個檔案名在哪里。顯然 cp 應該將來自 xargs 的輸入作為它的第一個運算元而不是第二個運算元,但我該如何讓它做到這一點呢?
uj5u.com熱心網友回復:
xargs有一個-I引數,它本質上允許您指定替換模式并在命令中撰寫替換模式(cp在您的情況下為 )。然后,當執行該命令時,該替換模式的所有實體都將替換為下一行輸入。因此,您的命令字串應如下所示:
head -n 150 ../indexes/index.txt | xargs -I {} cp {} ~/path/to/destination/
沒有-I,cp只會將輸入的第二行視為目標,這不是預期的。
更新:所以,對正在發生的事情進行細分:從 讀取每一行輸入時head,由于您已經設定了一個管道,因此 的輸出將head進入管道。當xargs從管道獲取新行時,因為您已指定 ... -I {} cp {} ...,而不是嘗試創建一個由每一行輸入組成的大引數字串并嘗試將其傳遞給cp,而是cp使用每一行輸入作為源運算元來執行。
為了進一步解釋,請考慮這種情況。我們有一個名為的檔案test.txt,其中包含以下內容:
some_file.txt
another_file.txt
a_third_file.txt
現在,假設我們要撰寫一個命令將所有這些檔案復制到給定的目的地。如果我們簡單地寫...
cat test.txt | xargs cp /path/to/destination
...那么cp有效地看到的是:
cp some_file.txt another_file.txt a_third_file.txt
在這種形式中,它嘗試將其a_third_file.txt視為目錄并將前兩個檔案復制到其中(這就是為什么在您的情況下cp說第 150 個路徑不是目錄的原因)。xargs -I {}修復:
cat test.txt | xargs -I {} cp {} ~/path/to/destination
現在,不是cp只執行一次,而是cp執行了三次:
cp some_file.txt ~/path/to/destination
cp another_file.txt ~/path/to/destination
cp a_third_file.txt ~/path/to/destination
uj5u.com熱心網友回復:
如果使用 GNU 版本cp,它可以-t directory選擇指定復制所有檔案名的目標,而不是最后一個引數:
head -n 150 ../indexes/index.txt | xargs cp -t ~/path/to/destination/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475841.html
上一篇:Bash:將陣列拆分為KV對
