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」を追加)。愚かなミスが発生した場合は後悔するでしょう!