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
은 입력 파일의 각 줄을 별도의 데이터 항목으로 취급합니다.-0
xargs가 읽은 스트림에 쉘과 유사한 (그러나 쉘과 호환 되지는 않지만 ) 구문 분석을 적용하지 못하게하려면 이 또는 개행 문자 대신 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
만 디렉토리와 일치합니다.
-print0
null 바이트로 분리 된 출력 \ 0
| xargs
xargs로 파이프
-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