rm -iRがループ内で動作しない

rm -iRがループ内で動作しない

これは私のループです。

ls -ltrd * | head -n -3 | awk '{print $NF}' | while read y; do

rm -iR $y

done

出力:

rm:ディレクトリを入力しますかoct_temp17? rm:ディレクトリを入力しますか oct_temp18? rm:ディレクトリを入力しますかoct_temp19? ....

ユーザーに確認メッセージを表示せず、理想的には手動で実行するときにrm -iを実行する必要があります。

Linux 3.10でbashシェルを使用しています。

私はUnix / Linuxについて非常に素朴です。 ls出力の各フォルダを確認するようにスクリプトで要求する方法を提案できますか?

答え1

1. 例が期待どおりに機能しない理由

rmプロンプトからフィードバックを受け取るにはSTDINが必要です。あなたの例では、STDINを使用してリストをwhileループにパイプするので、ユーザーではなく//コマンドからプロンプトへの応答を取得しますrmlsheadawk

解決策は、STDINを使用せずにループにリストを提供することです。たとえば、次のようになります。

for y in $(ls -ltrd * | head -n -3 | awk '{print $NF}'); do
  rm -iR $y
done

2. より安全なアプローチ

awkスペースを含むファイル名を準備します(ファイル名を取得するためにls最初の場所にのみファイル名を印刷するように指示する必要はありません)。

IFS=
for y in $(ls -1qtrd * | head -n -3); do
  rm -iR "$y"
done

3.より簡単な方法

Archemarが指摘したように、(ファイル名にスペースがない限り)ループも必要ありません。

rm -iR $(ls -1qtrd * | head -n -3)

関連情報