2012-11-05 101 views
6

的參數Linux命令輸出我想傳遞一個命令的元件的輸出列表作爲另一命令的參數。我已經發現了一些其他的網頁:作爲另一個命令

,但他們似乎更復雜。

我只是想將文件複製到到Linux find命令撥打電話的每個結果。

這裏有什麼問題?:

find . -name myFile 2>&1 | cp /home/myuser/myFile $1 

感謝

回答

16

這是你想要什麼:這

find . -name myFile -exec cp /home/myuser/myFile {} ';' 

細目/解釋:

  • find:調用find命令
  • .:開始從當前工作目錄中搜索。
  • 由於沒有指定任何深度的標誌,這將遞歸地搜索所有子文件夾
  • -name myFile:找到明確的名稱myFile
  • -exec文件:用於搜索結果,與他們進行額外的命令
  • cp /home/myuser/myFile {}:副本/home/myuser/myFile覆蓋由find到返回的每個結果;將{}想象爲每個搜索結果的去向。
  • ​​3210:用於區分不同的命令後find
+0

只需將{}的順序更改爲/ home/myuser/myFile之後的第二個位置,它就可以工作。謝謝。 –

+0

@LuisAndrésGarcía啊,我可能誤解了你 - 你想複製一個文件'/ home/myuser/myFile'來覆蓋cwd中'find'找到的任何'myFile'? –

+0

你是對的! :)另一個例子,列出任何找到的文件的屬性是:find -exec ls -l {}';' –

2

管道將一個程序的輸出發送到另一個的輸入。 cp不會從它的輸入流在終端讀取,它僅僅使用的參數在命令行上。

您希望使用管道xargs或使用findexec參數而不是管道。

+2

你能舉個例子, 請?非常感謝你。 –

3

有一對夫婦的方式來解決這個問題,這取決於你是否需要擔心在其名稱中空格或其他特殊字符的文件中運行。

如果沒有文件名有空格或特殊字符(它們只包含字母,數字,破折號和下劃線),再下面是一個簡單的解決方案,將工作。您可以使用$(command)來執行命令,並將結果替換爲另一個命令的參數。殼將分裂的結果上空格,製表符,或換行符和for每個值依次分配給$f,並且在每個值運行的命令。

for f in $(find . -name myFile) 
do 
    cp something $f 
done 

如果您確實有空格或製表符,您可以使用find的-exec選項。您通過-exec command args,將{}放在您想要替換文件名的位置,並以;結束參數。您需要引用{};以便shell不解釋它們。

find . -name myFile -exec cp something "{}" \; 

有時-exec是不夠的。例如,在this question中,他們希望使用Bash參數擴展來計算文件名。爲了做到這一點,您需要通過-exec bash -c 'your command',但是您會遇到{}替換引用問題。爲了解決這個問題,你可以使用從find-print0打印與空字符(這是在文件名中無效)界定的結果,管到一個while read循環,對空值分割參數:

find . -name myFile -print0 | (while read -d $'\0' f; do 
    cp something "$f" 
    done) 
相關問題