これは私のループです。
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
ループにパイプするので、ユーザーではなく//コマンドからプロンプトへの応答を取得しますrm
。ls
head
awk
解決策は、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)