xargs가 1개의 문자열을 입력으로 사용하지만 문자열을 별도의 줄에 배치하지 않는 이유는 무엇입니까?

xargs가 1개의 문자열을 입력으로 사용하지만 문자열을 별도의 줄에 배치하지 않는 이유는 무엇입니까?

xargs를 통해 파일을 rm으로 파이프하려고 합니다. 내가 하고 싶은 일을 git clean으로 할 수 있다는 건 알지만, cli로 연습하고 있어요.
나는 이것을 시도했습니다 :

for files in $(git status --porcelain| sed 's/^??//g'); do echo $files; done | xargs rm -rf

하지만 작동하지 않습니다. 나는 이것이 런타임 때문이라고 생각합니다.

for files in $(git status --porcelain| sed 's/^??//g'); do echo $files; done | xargs

파일은 공백으로 구분된 1개의 문자열로 표시됩니다.
하지만 실행하면 for files in $(git status --porcelain| sed 's/^??//g'); do echo -n $files; done파일이 콘솔에 별도의 줄로 표시됩니다.

그래서 (내가 옳다면)
for files in $(git status --porcelain| sed 's/^??//g'); do echo -n $files; done | xargs
: 과 의 차이점은 무엇입니까?

for files in $(git status --porcelain| sed 's/^??//g'); do echo -n $files; done

두 번째 경우의 파일은 각 줄에 표시되는 반면 첫 번째 경우에는 문자열입니까? rm -rf와 함께 작동하도록 이 문제를 어떻게 수정합니까?

답변1

당신은 인생을 불필요하게 복잡하게 만들고 있습니다 ;-)

하위 쉘 명령(귀하의 표현식 $())이 이미 파일 이름 목록을 제공하고 "대상 명령"(귀하의 경우 rm -rf )이 이미 파일 이름 목록을 허용하는 경우 그냥 사용하지 않는 것이 좋습니다.

git status --porcelain| sed 's/^??//g' | xargs rm -rf

또는 bash에서 "for 루프"를 연습하려면 xargs가 필요하지 않습니다.

for f in $(git status --porcelain| sed 's/^??//g') ; do
    rm -rf $f
done

그런데... 실행하기 전에 "rm -rf" 명령을 다시 확인하세요("rm -rf" 앞에 "echo" 추가). 어리석은 실수가 발생하면 후회하게 될 것입니다!

관련 정보