2013-09-11 1 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

이 시도 ..... 난이, 도움이 될 것입니다 생각 "찾을 수 있습니다. | 그렙"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

일 가능성에 대한 가장 부드럽게 ;-) RTFM을 전달 – necromancer

+0

그래 찾아 xargs를이 꽤 놀랍다. – sashang

16

find . | grep "file_for_print" | xargs -I % sh -c 'echo %; cat %;' 무엇 자신의 bash는 함수를 작성에 대해

+1

정확히 내가 무엇을 찾고 있었는지! 고맙습니다! – John

+0

도와 주셔서 감사합니다 .-) – necromancer

0

(OP는 %의 누락되었다)?

#!/bin/bash 

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

find . -name "file_for_print*" | myFunction 
6

아직 말했다되지 않은 이후로 : -I % 당신이 그것을 줄 명령에 인수 '%'를 대체 할 xargs를 알려줍니다. sh -c '...'은 새로운 쉘에서 '...' 명령을 실행한다는 것을 의미합니다.

그래서

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

echo [filename]xargs에게 주어진 모든 파일 이름을 cat [filename] 다음에 실행됩니다. echo와 cat 명령은 다른 쉘 프로세스 내에서 실행될 것이지만 이것은 대개 중요하지 않습니다. xargs에 전달 된 명령 안에 % 기호가 없어서 버전이 작동하지 않았습니다. 그것이 내가 같은 일을 달성하기 위해이 명령을 사용하는 것이 가치가 무엇인지에 대한


:

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

은 간단는 (parallel 자동으로 대체 문자로 {}을 사용하며 기본적으로 여러 명령을 취할 수)이기 때문에.

0

이 특정 경우 각 명령은 개별 파일마다 실행되므로 xargs를 사용할 때 이점이 없습니다. 이 경우 -print에서

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

이 RICI 지적 첫 echo로 대신 사용 할 수 있지만,이 예제는 두 개의 임의의 명령을 실행할 수있는 능력을 보여줍니다 당신은 당신의 '발견'에 두 번 간부 추가 할 수 있습니다 하나의 find