[bash] xargs로 여러 명령 실행

cat a.txt | xargs -I % echo %

위의 예에서 xargs는 echo %명령 인수로 사용됩니다. 그러나 어떤 경우에는 인수 대신 하나의 인수를 처리하기 위해 여러 명령이 필요합니다. 예를 들면 다음과 같습니다.

cat a.txt | xargs -I % {command1; command2; ... }

그러나 xargs는이 양식을 허용하지 않습니다. 내가 아는 한 가지 해결책은 명령을 래핑하는 함수를 정의 할 수 있지만 파이프 라인이 아니며 선호하지 않습니다. 다른 해결책이 있습니까?



답변

cat a.txt | xargs -d $'\n' sh -c 'for arg do command1 "$arg"; command2 "$arg"; ...; done' _

… 또는,없는 고양이의 쓸모를 사용 :

<a.txt xargs -d $'\n' sh -c 'for arg do command1 "$arg"; command2 "$arg"; ...; done' _

더 좋은 점을 설명하려면 :

  • 를 사용하는 "$arg"대신에 %(그리고이없는 -I에서 xargs명령 줄) 보안상의 이유로입니다 : 데이터 전달 sh의 명령 줄 인수 목록 대신 데이터 같은 (포함 할 수 있다는 코드 방지의 콘텐츠로 대체 $(rm -rf ~), 특히 걸릴 악성 예) 코드로 실행되지 않습니다.

  • 마찬가지로, 사용 -d $'\n'하는 GNU 확장 xargs은 입력 파일의 각 줄을 별도의 데이터 항목으로 취급합니다. -0xargs가 읽은 스트림에 쉘과 유사한 (그러나 쉘과 호환 되지는 않지만 ) 구문 분석을 적용하지 못하게하려면 이 또는 개행 문자 대신 NUL이 필요합니다 . (GNU xargs가없는 경우을 사용 tr '\n' '\0' <a.txt | xargs -0 ...하지 않고 줄 지향 읽기를 얻을 수 있습니다 -d).

  • _플레이스 홀더이기 $0등이 추가로 다른 데이터 값 xargs이 될 $1가치관의 기본 설정되는 일이있는 전방 및 for루프 반복 처리.


답변

GNU Parallel을 사용하면 다음을 수행 할 수 있습니다.

cat a.txt | parallel 'command1 {}; command2 {}; ...; '

자세한 내용은 소개 동영상을 참조하십시오. https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

보안상의 이유로 패키지 관리자를 사용하여 설치하는 것이 좋습니다. 그러나 그렇게 할 수 없다면이 10 초 설치를 사용할 수 있습니다.

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


답변

이것은 xargs 또는 cat이없는 또 다른 접근법입니다.

while read stuff; do
  command1 "$stuff"
  command2 "$stuff"
  ...
done < a.txt


답변

당신이 사용할 수있는

cat file.txt | xargs -i  sh -c 'command {} | command2 {} && command3 {}'

{} = 텍스트 파일의 각 줄에 대한 변수


답변

내가하는 한 가지는 .bashrc / .profile 에이 기능을 추가하는 것입니다.

function each() {
    while read line; do
        for f in "$@"; do
            $f $line
        done
    done
}

다음과 같은 일을 할 수 있습니다

... | each command1 command2 "command3 has spaces"

xargs 또는 -exec보다 덜 장황합니다. 또한 해당 동작이 필요한 경우 명령의 임의 위치에서 읽은 값을 각 위치에 삽입하도록 함수를 수정할 수도 있습니다.


답변

나는 드라이 런 모드를 허용하는 스타일을 선호한다 | sh.

cat a.txt | xargs -I % echo "command1; command2; ... " | sh

파이프와도 작동합니다.

cat a.txt | xargs -I % echo "echo % | cat " | sh


답변

파티에 조금 늦었 어

마이그레이션하기 전에 수천 개의 작은 파일로 디렉토리를 압축하는 데 아래 형식을 사용합니다. 명령 안에 작은 따옴표가 필요하지 않으면 작동합니다.

약간의 수정으로 누군가에게 유용 할 것이라고 확신합니다. Cygwin(바분) 에서 테스트

find . -maxdepth 1 ! -path . -type d -print0 | xargs -0 -I @@ bash -c '{ tar caf "@@.tar.lzop" "@@" && echo Completed compressing directory "@@" ; }'

find .여기 찾기
-maxdepth 1하위 디렉토리로 이동하지 마십시오
! -path .제외합니다. / 현재 디렉토리 경로
-type d만 디렉토리와 일치합니다.
-print0null 바이트로 분리 된 출력 \ 0
| xargsxargs로 파이프
-0입력이 널로 분리 된 바이트입니다.
-I @@자리 표시자는 @@입니다. @@을 입력으로 바꿉니다.
bash -c '...'Bash 명령 실행
{...}명령 그룹화
&& 이전 명령이 성공적으로 종료 된 경우에만 다음 명령을 실행 (종료 0).

결승 ;은 중요합니다. 그렇지 않으면 실패합니다.

산출:

Completed compressing directory ./Directory1 with meta characters in it
Completed compressing directory ./Directory2 with meta characters in it
Completed compressing directory ./Directory3 with meta characters in it

2018 년 7 월 업데이트 :

해킹과 장난을 좋아한다면 흥미로운 것이 있습니다.

echo "a b c" > a.txt
echo "123" >> a.txt
echo "###this is a comment" >> a.txt
cat a.txt
myCommandWithDifferentQuotes=$(cat <<'EOF'
echo "command 1: $@"; echo 'will you do the fandango?'; echo "command 2: $@"; echo
EOF
)
< a.txt xargs -I @@ bash -c "$myCommandWithDifferentQuotes" -- @@

산출:

command 1: a b c
will you do the fandango?
command 2: a b c

command 1: 123
will you do the fandango?
command 2: 123

command 1: ###this is a comment
will you do the fandango?
command 2: ###this is a comment

설명 :
하나의 라이너 스크립트를 작성하고 변수에 저장
xargs 읽어 a.txt하고 실행하는 그것을 bash스크립트
@@ 확인 전체 라인이 통과 될 때마다한다
퍼팅 @@--확인합니다 @@에 위치 매개 변수 입력으로 촬영 bash명령이 아닌 bash시작 OPTION, 즉, 추천 -c자체하는 수단run command

--마법, 그것은 즉, 다른 많은 것들, 작동 ssh도,kubectl