2013-09-11 61 views
11

在當前目錄中,我想打印文件名和內容。 我可以xargs與多個命令

find . | grep "file_for_print" | xargs echo 
find . | grep "file_for_print" | xargs cat 

單獨打印的文件名或內容,但我要的是打印他們這樣在一起:

file1 
line1 inside file1 
line2 inside file1 
file2 
line1 inside file2 
line2 inside file2 

我讀xargs with multiple commands as argument 並試圖

find . | grep "file_for_print" | xargs -I % sh -c 'echo; cat;' 

但沒有按」工作。 我不熟悉xargs,所以不知道「-I%sh -c」是什麼意思。 任何人都可以幫助我嗎?謝謝!

+0

試試這個.....我想這應該幫助,「找|。grep的‘file_for_print’| xargs的多個」 – nsd

回答

14

首先,幾乎沒有任何區別:除了第二人會不喜歡this_is_not_the_file_for_print匹配文件名

find . | grep "file_for_print" | xargs echo 

find . -name "file_for_print*" 

,它將打印文件名一個每線。它的速度也會快很多,因爲它不需要生成和打印整個遞歸目錄結構,只是爲了讓grep折騰大部分目錄結構。

find . -name "file_for_print*" 

實際上是完全一樣

find . -name "file_for_print*" -print 

其中-print動作打印每個匹配的文件名,然後換行。如果您不提供find的任何操作,則假定您想要-print。但它有更多的技巧。例如:

find . -name "file_for_print*" -exec cat {} \; 

-exec動作原因找到要執行下面的命令,直到\;,每個匹配的文件名稱替換{}

find並不限於一個動作。你可以告訴它做任何你想要的東西。所以:

find . -name "file_for_print*" -print -exec cat {} \; 

可能會做得很好你想要的。

對於很多在這個非常有用的工具的更多信息,請鍵入:

man find 

info find 

和閱讀所有關於它。

+5

+1可能是最輕輕交付RTFM ;-) – necromancer

+0

耶發現和xargs的是相當了不起。 – sashang

16

find . | grep "file_for_print" | xargs -I % sh -c 'echo %; cat %;'(OP失蹤% S)

+1

正是我在找什麼!謝謝! – John

+0

高興得到了幫助:-) – necromancer

0

如何編寫自己的bash的功能是什麼?

#!/bin/bash 

myFunction() { 
    while read -r file; do 
     echo "$file" 
     cat "$file" 
    done 
} 

find . -name "file_for_print*" | myFunction 
6

,因爲它尚未說:-I %告訴xargs的,在你給它的命令的參數來替換「%」。 sh -c '...'只是意味着在新的shell中運行命令'...'

所以

xargs -I % sh -c 'echo %; cat %;' 

將運行之後cat [filename]爲給xargs每名echo [filename]。 echo和cat命令將在不同的shell進程中執行,但這通常並不重要。您的版本無法正常工作,因爲它丟失了傳遞到xargs的命令中的%標誌。


對於什麼是值得我用這個命令來實現同樣的事情:

find -name "*file_for_print*" | parallel 'echo {}; cat {};' 

,因爲它更簡單(parallel自動使用{}作爲替換字符,可以在默認情況下需要多個命令)。

0

在這種特殊情況下,無論如何每個單獨的文件都會執行每個命令,所以在使用xargs時沒有任何優勢。你可能只是追加-exec兩次「尋找」:

find . -name "*file_for_print*" -exec echo {} \; -exec cat {} \; 

在這種情況下-print可以用來代替第一echo由RICI指出的,但是這個例子顯示了執行與兩個任意命令的能力單find