環境
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でループしている場合の対処としてこの記事は残します。