2011-07-26 28 views
22

我正在學習一個unix/linux類,我們還沒有學習變量或函數。我們只是學習了一些基本的工具,例如標誌和管道,輸出和追加到文件。在實驗室任務中,他希望我們找到最大的文件並將其複製到目錄。傳遞輸出作爲cash中的參數bash

我可以得到5頁最大的文件,但我不知道如何將它們傳遞到CP在一個命令

ls -SF | grep -v/| head -5 | cp ? Directory 
+6

'男人xargs'是你的朋友? –

+0

參見[如何通過'find'結果'cp'使得具有空格的文件名工作](HTTP ://stackoverflow.com/questions/18724826/how-to-pass-find-results-to-cp-such-that-file-names-with-spaces-work)。 – tripleee

回答

46

這將是:

cp `ls -SF | grep -v/| head -5` Directory 

假設管道是正確的。反引號代替行內命令的輸出。

您也可以讓你的測試:

cp `echo a b c` Directory 

將複製所有ab,並cDirectory

25

我會做:

cp $(ls -SF | grep -v/| head -5) Directory 

xargs的很可能是最好的答案,但。

ls -SF | grep -v/| head -5 | xargs -I{} cp "{}" Directory 
5

使用反斜槓'like this`或美元符號$(如此)來執行命令替換。基本上,這將反向命令的每行標準輸出粘貼到周圍的命令中並運行它。在「命令替換」下找到更多信息。

另外,如果你想在一次讀取一行可以讀取各行出使用管道流「而改爲」語法:

ls | while read varname; do echo $varname; done 
+0

這正是我需要將窗口標識符列表(從'xwininfo'的輸出中刪除並剪切)到'xdotool'中,這樣我就可以關閉一堆彈出的錯誤對話框。此語法適用於zsh :) – Desty

0

如果您cp有一個「-t」標誌(檢查手冊頁),它簡化了事情有點:

ls -SF | grep -v/| head -5 | xargs cp -t DIRECTORY 

find命令爲您提供了更細粒度的能力得到你想要的東西,而不是ls | grep你帶來了。我想編寫你的問題是這樣的:

find . -maxdepth 1 -type f -printf "%p\t%s\n" | 
sort -t $'\t' -k2 -nr | 
head -n 5 | 
cut -f 1 | 
xargs echo cp -t DIRECTORY 
+0

我檢查了我的系統上的手冊頁(macOS 10.12.1),並且-t選項似乎不存在: '〜$ cp -t main.c main2.c cp :非法選項-t' –

+1

我認爲-t是GNU選項,Mac不是GNU。 –