xargs -str 옵션 차이를 대체합니다


16

내 이해에서 다음은 정확히 동일해야합니다.

ls -1 | xargs file {}
ls -1 | xargs -I{} file {}

-I 옵션이 지정되지 않은 경우 기본값은 -I {}입니다.

현재 디렉토리의 모든 파일을 나열하고 각 파일에서 file명령을 실행하고 싶습니다 . 일부는 이름에 공백이 있습니다. 그러나 나는 그 차이를 알아 차렸다. 아래를보십시오 :

$ ls -1
Hello World
$ ls -1 | xargs file {}
{}:    ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory

-I {}을 명시 적으로 지정하면 파일 이름의 공백이 예상대로 처리됩니다.


3
"-I 옵션이 지정되지 않은 경우 기본값은 -I {}"입니다. 이것은 적어도 GNU xargs에서는 올바르지 않습니다.
jjlin

내 실수를 이해합니다. 나도 지정해야 xargs file하거나 xargs -I{} file {}. 해서는 안됩니다 xargs file {}. 명시 적으로 -I {}을 지정할 때 bash는 그것을으로 취급합니다 file "Hello World". -I {} 없이는로 취급됩니다 file Hello World.
foresightyj

1
(1)이 논의는 쉘 (bash)과 관련이 없다. (2)에 대한 -1옵션을 아는 것이 좋지만 ls출력이 ls파일 또는 파이프 인 경우 기본적으로 켜져 있으므로 여기서 필요하지 않습니다. (3) -I더 이상 사용되지 않는 -i(소문자 I) 옵션 과 혼동 됩니다 . -ifoo는에 해당 -Ifoo하지만 plain -i은에 해당합니다 -I{}. 그러나을 사용하십시오 -I{}. (4)하고 싶은 말을 정말로하고 싶다면 왜 그렇게 말하지 file *않습니까?
Scott

@Scott 나의 원래 의도는`find를 쓰는 것이었다. -name "* .mov"| 모든 mov 파일을 재귀 적으로 찾아서 실행하려면 xargs -I {} 파일 {}` file. 그러나 나는를 사용하여 더 간단한 예를 생각해 냈습니다 ls. 네 말이 맞아 이를 위해 file *최고입니다.
foresightyj

1
찾기-exec있습니다.
Cristian Ciupitu

답변:


20

-I정의 된 자리가 필요합니다. 이 -i옵션은 {}자리 표시 자라고 가정 합니다. 여기서는 man xargs적어도 Cygwin과 CentOS에서 {}의 가정을 찾았습니다 .

옵션없이 호출 된 xargs는 자리 표시자가 필요하지 않으며 인수 끝에 STDIN을 추가합니다.

echo예제에 추가 하여 xargs가 수행하는 작업을 확인하십시오.

$ ls -1
Hello World/

실수의 예는 {}다음을 사용합니다 .

$ ls -1 | xargs echo file {}
file {} Hello World/

따라서 filecmd는 인수 {} Hello World및 오류를 확인합니다.

{}xargs 호출 에 명시 적으로 사용하려면 다음 을 수행하십시오.

$ ls -1 | xargs -i echo file {}
file Hello World/

또는 자리 표시자가없는 경우 :

$ ls -1 | xargs echo file
file Hello World/

위에서 호출 한 xargs에는 {}가 필요하지 않습니다. 플레이스 홀더없이 STDIN을 명령의 끝에 추가합니다. {}을 사용한다는 것은 일반적으로 다음과 같이 cmd 중간에 STDIN이 실행되기를 원하는 것을 의미합니다.

$ ls -1 | xargs -i mv {} /path/to/someplace/.

매우 분명합니다. 대답이 약간 늦었지만 그것을 읽으면 내 이해력이 실제로 강화됩니다.
foresightyj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.