xargs의 -i와 -I의 차이점

xargs의 -i와 -I의 차이점

이해합니다. 하지만 매뉴얼과 어떻게 다른지 , 매뉴얼에서 더 이상 사용되지 않는다고 말하는 이유를 -i모르겠습니다 . 예를 들어, 다음 두 줄을 사용하는 것의 차이점은 무엇입니까?-I-i

ls -t | tail -n 4 | xargs -I{} mv {} test2/

ls -t | tail -n 4 | xargs -i mv {} test2/

첫 번째 줄의 경우 첫 번째 줄 앞에 무엇이든 바꿀 수 있습니까 {}? -I아니면 이것이 단지 구문입니까?

감사해요

답변1

더 이상 사용되지 않는 이유는 관리자가 xargs더 이상 사용되지 않아야 한다고 결정했기 때문입니다. 1. 할 말이 별로 없다 . man xargs내 아치 시스템의 관련 부분은 다음과 같습니다 .

       -I replace-str
              Replace occurrences of  replace-str  in  the  initial-arguments
              with  names read from standard input.  Also, unquoted blanks do
              not terminate input items; instead the separator is the newline
              character.  Implies -x and -L 1.

       -i[replace-str], --replace[=replace-str]
              This  option  is  a synonym for -Ireplace-str if replace-str is
              specified.  If the replace-str argument is missing, the  effect
              is  the  same  as  -I{}.  This option is deprecated; use -I in‐
              stead.

-i따라서 및 사이의 유일한 차이점은 인수가 없으면 다음과 같이 처리된다는 -I것입니다 . 문자열은 이런 종류의 일에 자주 사용되며 관례가 되었습니다. 예를 들어, 해당 작업에서도 비슷한 방식으로 사용됩니다 .-i-I{}{}find{}-exec

      -exec command {} +
              This variant of the -exec action runs the specified command  on
              the  selected files, but the command line is built by appending
              each selected file name at the end; the total number of invoca‐
              tions  of  the  command  will  be  much less than the number of
              matched files.  The command line is built in much the same  way
              that xargs builds its command lines.  Only one instance of `{}'
              is allowed within the command, and it must appear at  the  end,
              immediately before the `+'; it needs to be escaped (with a `\')
              or quoted to protect it from interpretation by the shell.   The
              command  is executed in the starting directory.  If any invoca‐
              tion with the `+' form returns a non-zero value as exit status,
              then  find  returns a non-zero exit status.  If find encounters
              an error, this can sometimes cause an immediate exit,  so  some
              pending  commands  may  not  be  run  at  all.  For this reason
              -exec my-command ... {} + -quit may not  result  in  my-command
              actually being run.  This variant of -exec always returns true.

그러나 이는 단지 관례일 뿐이므로 xargs강제로 사용할 필요는 없습니다. {}xargs' 대신 무엇이든 사용할 수 있습니다 -I. 예를 들어:

$ seq 5 | xargs -I'&' echo "I read &"
I read 1
I read 2
I read 3
I read 4
I read 5

심지어:

$ seq 5 | xargs -I'a' echo "I read a"
I re1d 1
I re2d 2
I re3d 3
I re4d 4
I re5d 5

따라서 문자열이 주어지면 -i옵션은 와 100% 동일하거나 -I특정 사례에 대한 약어 입니다. 즉 , 명시적으로 지정한 것처럼 사용 -I{}하라는 의미입니다 .xargs{}

$ seq 5 | xargs -i'a' echo "I read a"  ## as above
I re1d 1
I re2d 2
I re3d 3
I re4d 4
I re5d 5

$ seq 5 | xargs -i echo "I read {}"  ## implies -I{}
I read 1
I read 2
I read 3
I read 4
I read 5

$ seq 5 | xargs -I echo "I read {}"  ## breaks because -I requires a string
xargs: I read {}: No such file or directory

분명히 관리자는 xargs이것이 더 이상 좋은 생각이 아니라고 결정했기 때문에 이 옵션은 이제 더 이상 사용되지 않으며 향후 릴리스에서는 제거될 수 있습니다.


1 할 말이 더 많은 것 같습니다.외르크 W. 미타그현재 삭제된 댓글에는 다음과 같은 내용이 언급되어 있습니다.

이 결정을 내린 사람은 xargs 관리자만이 아니라는 점에 유의하십시오. -i는 SUSv6(2004)에서도 "구식"으로 제거되었습니다. -I는 SUS 코어의 일부가 아니지만 (선택적) XSI 확장의 일부로만 정의됩니다. 그러므로 보수적인 표준 저자들조차 거의 20년 전인 이 책은 너무 오래된 것이라고 생각합니다.

관련 정보