디렉토리의 모든 파일을 grep하고 그 grep의 출력을 별도의 파일에 쓸 수있는 bash 명령을 찾고 싶습니다. 내 생각 엔 이런 식으로 뭔가했을 것입니다
ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"
그러나 내가 아는 한 xargs는 큰 따옴표를 좋아하지 않습니다. 그러나 큰 따옴표를 제거하면 명령이 전체 명령의 출력을 일련의 개별 파일 대신 ‘{}’라는 단일 파일로 리디렉션합니다.
xargs를 사용 하여이 작업을 수행하는 방법을 아는 사람이 있습니까? 방금 xargs에 대한 내 문제를 설명하기 위해이 grep 시나리오를 예제로 사용했기 때문에 xargs를 사용하지 않는 솔루션은 나에게 적합하지 않습니다.
답변
이 실수를하지 마십시오 :
sh -c "grep ABC {} > {}.out"
이것은 펑키 한 파일 이름을 포함하여 많은 조건에서 깨질 수 있으며 올바른 인용은 불가능합니다. 귀하 {}
반드시 항상 피하기 코드 주입 버그의 명령에 하나의 완전히 별도의 인수합니다. 당신이해야 할 일은 이것입니다 :
xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
에 적용 xargs
됩니다 find
.
그건 그렇고, -0
옵션 없이 xargs를 사용하지 마십시오 (데이터 파괴에 대해 걱정하지 않는 매우 드물고 통제 된 일회성 대화 형 사용을 제외하고는).
또한 구문 분석하지 마십시오 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 Parallel http://www.gnu.org/software/parallel/ 이 당신의 구조 일 수 있습니다. 파일 이름에 \ n이 포함되어 있지 않으면 추가 인용 부호가 필요하지 않습니다.
ls | parallel "grep ABC {} > {}.out"
파일 이름이 \ n 인 경우 :
find . -print0 | parallel -0 "grep ABC {} > {}.out"
추가 보너스로 작업을 병렬로 실행할 수 있습니다.
자세한 내용은 소개 비디오를 참조하십시오 : http://pi.dk/1
10 초 동안 설치하면 전체 설치를 시도합니다. 실패하면 개인 설치; 실패하면 최소 설치 :
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh
GNU Parallel이 설치되지 않은 서버로 서버를 이동해야하는 경우을 시도하십시오 parallel --embed
.