環境
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
やりたいこと
- 対象のディレクトリ配下の空のディレクトリを検索し削除する。
- 空のディレクトリがある場合、毎回削除するか確認する。
結論
- readを使用してwhileでループしている場合、while内で対話処理するreadは実行されない。
- 対処方法としてforでループする。
対象コード変更前
PARA_DIR=`pwd`
find ${PARA_DIR} -type d -empty | while read TARGET_RMDIR; do
echo "`$basename ${TARGET_RMDIR}`を削除する場合yを入力してください。"
read input #ここで対話処理したい
if [ "${input}" = "y" ]; then
rmdir ${TARGET_RMDIR}
fi
done
- 実行結果
(空のディレクトリのパス)を削除する場合yを入力してください。
read inputに指定しているところで処理が止まってくれない。原因は既にwhileでreadを使用しており、標準入力がfind ${PARA_DIR} -type d -emptyの結果だけとなるため。readは二回使えない。
対象コード変更後
PARA_DIR=`pwd`
TARGET_RMDIR=(`find ${PARA_DIR} -type d -empty`)
for (( i = 0; i < ${#TARGET_RMDIR[@]}; i++ )) do
echo "`basename ${TARGET_RMDIR[i]}`を削除する場合yを入力してください。"
read input
if [ "${input}" = "y" ]; then
rmdir ${TARGET_RMDIR[i]}
fi
done
- 実行結果
(空のディレクトリのパス[1])を削除する場合yを入力してください。
y #対話式で入力
(空のディレクトリのパス[2])を削除する場合yを入力してください。
y #対話式で入力
(空のディレクトリのパス[3])を削除する場合yを入力してください。
y #対話式で入力
あらかじめ削除対象のディレクトリを配列で保持し、for文でループする。
後からわかったこと
ディレクトリ削除をコンソールで確認するには以下でもいいことが判明。。。
rm -ri "$TARGET_RMDIR" < /dev/tty
やりたいことは達成できるけど、readを使用してwhileでループしている場合の対処としてこの記事は残します。