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

2番目のケースのファイルは各行に表示されますが、最初のケースでは文字列ですか? 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」を追加)。愚かなミスが発生した場合は後悔するでしょう!

おすすめ記事