XARGS 명령에서> 사용 방법은 무엇입니까?
문제
디렉토리의 모든 파일을 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