programing

xargs 명령에서 >를 사용하는 방법은 무엇입니까?

golfzon 2023. 4. 29. 10:05
반응형

xargs 명령에서 >를 사용하는 방법은 무엇입니까?

디렉터리에 있는 모든 파일을 grep하고 해당 grep의 출력을 다른 파일에 쓸 수 있는 bash 명령을 찾고 싶습니다.제 추측으로는 이런 일을 하는 것입니다.

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

하지만, 제가 알기로는, xargs는 이중 따옴표를 좋아하지 않습니다.그러나 이중 따옴표를 제거하면 명령은 전체 명령의 출력을 일련의 개별 파일이 아닌 '{}.out'이라는 단일 파일로 리디렉션합니다.

자그를 이용해서 이것을 하는 방법을 아는 사람이 있습니까?저는 이 grep 시나리오를 예로 들어 xargs에 대한 문제를 설명하여 xargs를 사용하지 않는 솔루션이 저에게 적용되지 않도록 했습니다.

다음과 같은 실수를 범하지 마십시오.

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

이것은 펑키한 파일 이름을 포함한 많은 조건에서 깨질 것이며 올바른 인용은 불가능합니다.당신의.{}코드 주입 버그를 방지하려면 명령에 대해 항상 완전히 별개의 단일 인수여야 합니다.당신이 해야 할 일은 다음과 같습니다.

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

에 됩니다.xargs만 아니라find.

그건 그렇고, 절대로 그것 없이 잔을 사용하지 마세요.-0옵션(데이터 파괴를 걱정하지 않는 매우 드물고 통제된 일회성 대화형 사용의 경우는 제외).

구분석 안함문을 구문하지 않습니다.ls이나 Ever. 글로빙을 사용하거나.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'"

편집: lunath의 주석 뒤에 작은 따옴표가 추가되었습니다.

저는 당신의 예시가 단지 예시일 뿐이며 다른 것들을 위해 >가 필요할 수도 있다고 생각합니다.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 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh

GNU Parallel을 사용해 .parallel --embed.

실제로 여기에 있는 대부분의 답변은 lunath 및 Stephan202의 답변을 포함하여 모든 파일 이름(이중 따옴표와 단일 따옴표가 포함된 경우)에서 작동하지 않습니다.

이 솔루션은 작은따옴표와 큰따옴표가 있는 파일 이름과 함께 작동합니다.

find . -mindepth 1 -print0 | xargs -0 -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}

다음은 단일 따옴표와 이중 따옴표가 모두 있는 파일 이름을 사용한 테스트입니다.

echo ABC > "I'm here.txt"

# lhunath solution (hangs waiting for input)

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

# Stephan202 solutions

$ find . -mindepth 1 -maxdepth 1 -type f -exec sh -c "grep ABC '{}' > '{}.out'" \;
grep: ./Im: No such file or directory
grep: here.txt > ./Im here.txt.out: No such file or directory

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

# this solution
$ find . -mindepth 1 -print0 | xargs -0 -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}

$ ls -1
"I'm here.txt"
"I'm here.txt.out"

언급URL : https://stackoverflow.com/questions/845863/how-to-use-in-an-xargs-command

반응형