문제

디렉토리의 모든 파일을 GREP하고 해당 GREP의 출력을 별도의 파일에 쓸 수있는 bash 명령을 찾고 싶습니다. 내 추측은 이런 일을하는 것이었을 것입니다

ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"

그러나 내가 아는 한, Xargs는 이중 인용문을 좋아하지 않습니다. 그러나 이중 점수를 제거하면 명령은 전체 명령의 출력을 일련의 개별 파일 대신 '{}'라는 단일 파일로 리디렉션합니다.

Xargs를 사용하여 이것을하는 방법을 아는 사람이 있습니까? 방금이 GREP 시나리오를 예로 사용하여 XARGS 문제를 설명하기 위해 XARG를 사용하지 않는 솔루션이 적용 할 수 없습니다.

도움이 되었습니까?

해결책

이 작업을 수행하는 실수를하지 마십시오.

sh -c "grep ABC {} > {}.out"

이것은 Funky Filename을 포함하여 많은 조건에서 깨질 것이며 인용하기가 불가능합니다. 당신의 {} 코드 주입 버그를 피하기 위해 항상 명령과 완전히 별도의 인수가 있어야합니다. 당신이해야 할 일은 다음과 같습니다.

xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}

적용됩니다 xargs 만큼 잘 find.

그건 그렇고, xargs 없이는 절대 사용하지 마십시오 -0 옵션 (데이터 파괴에 대해 걱정하지 않는 매우 드물고 제어 된 일회성 대화식 사용이 아니라면).

또한 구문 분석하지 마십시오 ls. 항상. Globbing 또는 사용하십시오 find 대신에: http://mywiki.wooledge.org/parsingls

사용 find 재귀가 필요한 모든 것에 대해, 다른 모든 것을위한 글로그와 함께 간단한 루프.

find /foo -exec sh -c 'grep "$1" > "$1.out"' -- {} \;

또는 비 수수료 :

for file in *; do grep "$file" > "$file.out"; done

인용문의 적절한 사용을 주목하십시오.

다른 팁

없는 해결책 xargs 다음은 다음과 같습니다.

find . -mindepth 1 -maxdepth 1 -type f -exec sh -c "grep ABC '{}' > '{}.out'" \;

... 그리고 동일하게 할 수 있습니다 ~와 함께 xargs, 그것은 밝혀:

ls -1 | xargs -I {} sh -c "grep ABC '{}' > '{}.out'"

편집하다: 단일 따옴표가 다음에 의해 추가되었습니다 lhunath.

나는 당신의 모범이 단지 예일 뿐이며 당신이 다른 것들에 대해> 필요할 수 있다고 가정합니다. GNU 평행 http://www.gnu.org/software/parallel/ 당신의 구조 일 수 있습니다. 파일 이름이 n을 포함하지 않는 한 추가 인용이 필요하지 않습니다.

ls | parallel "grep ABC {} > {}.out"

n이있는 파일 이름이있는 경우 :

find . -print0 | parallel -0 "grep ABC {} > {}.out"

추가 보너스로 작업을 동시에 실행하게됩니다.

편집하다.

간단히 다음과 같이 GNU 병렬을 설치할 수 있습니다.

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

자세한 내용은 소개 비디오를 시청하십시오. http://pi.dk/1

10 초 설치 :

wget pi.dk/3 -qO - | sh -x
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top