我正在尝试通过 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
你让你的生活变得不必要的复杂;-)
如果 subshell 命令(您的 中的表达式$()
)已经提供了文件名列表,并且“目标命令”(在您的情况下为 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”),如果发生愚蠢的错误,您会后悔的!