2015-10-15 267 views
10

我有一個工作grep命令來選擇符合特定條件的文件。如何從grep命令中選取文件並將其傳送到cp命令?如何將輸出從grep輸出到cp?

下面的嘗試都失敗的cp末:

grep -r "TWL" --exclude=*.csv* | cp ~/data/lidar/tmp-ajp2/ 

CP:缺少目標文件操作 後 '的/ home/Ubuntu的/數據/激光雷達/ TMP-ajp2 /' 嘗試「CP - 幫助'更多 信息。


cp `grep -r "TWL" --exclude=*.csv*` ~/data/lidar/tmp-ajp2/ 

CP:無效選項 - '7'

+0

可能重複[執行操作* \ grep列出的每個\ *項目](http://stackoverflow.com/questions/9682721/perform-an-operation-for-each- item-listed-by-grep) – tripleee

+1

'| xargs cp -t dir' – tripleee

回答

17
grep -l -r "TWL" --exclude=*.csv* | xargs cp -t ~/data/lidar/tmp-ajp2/ 

說明:

  • grep的-l選項輸出文件名只
  • xargs的從標準輸入轉換文件列表中的命令行參數
  • CP -t選項來指定目標目錄(並避免使用佔位符)
+0

'-l'選項對我不起作用。除此之外,它工作正常。 – marcelocra

+0

'-t'被認爲是macOS sierra上'cp'的非法選項。 – MeadowMuffins

10

你需要xargs的佔位選項:

grep -r "TWL" --exclude=*.csv* | xargs -I '{}' cp '{}' ~/data/lidar/tmp-ajp2/ 

通常如果您使用xargs,它會在命令後面輸出,使用佔位符(在這種情況下爲'{}'),您可以選擇它插入的位置,甚至多次。

+1

在Solaris中工作正常。 –

0

T O複製文件到grep找到目錄,使用-printf輸出目錄和-i來放置命令參數從xarg(管後)

find ./ -name 'filename.*' -print '%h\n' | xargs -i cp copyFile.txt {} 

這個副本COPYFILE.TXT所有目錄包含「(以./) filename'

0

grep -rl'/ directory /'-e'pattern'| xargs cp -t/directory

+0

你願意詳細說明嗎? – mrun