이해합니다. 하지만 매뉴얼과 어떻게 다른지 , 매뉴얼에서 더 이상 사용되지 않는다고 말하는 이유를 -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년 전인 이 책은 너무 오래된 것이라고 생각합니다.