为什么 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

你让你的生活变得不必要的复杂;-)

如果 subshel​​l 命令(您的 中的表达式$())已经提供了文件名列表,并且“目标命令”(在您的情况下为 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”),如果发生愚蠢的错误,您会后悔的!

相关内容