指摘したディレクトリからすべてのASCIIテキストファイルを検索し、各ファイルのパスをテキストファイルに書き込むスクリプトを作成しようとしています。次に、各ファイルのヘッダーを1つずつ表示し、ファイルを削除するかどうかを尋ねるメッセージを表示します。 「はい」と言うとファイルが削除され、別の言い方をすると、次のファイルだけが表示されるように各ファイルを確認するまで続きます。だから私が終わるのは次のとおりです。
#!/bin/bash
echo "Give directory to search for ASCII text files"
read direct
find $direct -type f -exec file {} + | grep ASCII > ztextz
sed "s/ .*//" ztextz > ztextz1
sed "s/://g" ztextz1 > ztextz2
#until here everything works fine
#it creates the file that contains paths of all ASCII text files in the directory given by you
#After that it is a mess..it needs to check the head of every file one by one
#and let me decide if I want to delete it or not
files=ztextz2
while IFS= read -r name;
do
head "$name";
echo "Do you want to delete this file?"
read want
case $want in
YES)
rm $name;;
Yes)
rm $name;;
yes)
rm $name;;
Y)
rm $name;;
y)
rm $name;;
esac
done < "$files"
したがって、出力としてディレクトリ内の最初のテキストファイルの10行を見て、ファイルを削除するかどうかを尋ねるメッセージを表示したいと思います。 「はい」と答えると、ファイルが削除され、次のファイルの10行が表示されます。
今私が得る出力は、2つのファイル(私のディレクトリに4つのファイルがある)の最初の10行と「このファイルを削除しますか?」という質問です。その後、スクリプトが中断されます。
期待どおりに動作しないようです。誰かが私が間違っている場所を説明できますか?
さて、私が直接答えるほど評判が悪くてここに入れます。
はい、私は$ $ numbのように2つの$ $を組み合わせるのに問題があった古いスクリプトに固執し、それを$ {! numb}に置き換えて動作し始めました。これで、テキストファイルから自分のディレクトリをクリーンアップできます。このスクリプトには必要ありません =)
#!/bin/bash
echo "Give directory to search for ASCII text files"
read direct
find $direct -type f -exec file {} + | grep ASCII > ztextz
sed "s/ .*//" ztextz > ztextz1
sed "s/://g" ztextz1 > ztextz2
set `less ztextz2`
numb=$#
rm ztextz*
while [ $numb -gt 0 ]
do head ${!numb}
echo "Do you want to delete ${!numb} file?"
read want
case $want in
yes)
rm ${!numb}
echo "File is removed"
sleep 1;;
Yes)
rm ${!numb}
echo "File is removed"
sleep 1;;
Y)
rm ${!numb}
echo "File is removed"
sleep 1;;
y)
rm ${!numb}
echo "File is removed"
sleep 1;;
YES)
rm ${!numb}
echo "File is removed"
sleep 1;;
esac
numb=$[$numb-1]
done
PS。すばやく削除してくださいsleep 1
=)
ベストアンサー1
問題は、あなたが使用していることです二つはいread
- 1つはファイル名を読み、もう1つは答えを取得します。したがって、read
回答を待つことは2番目のファイル名を占め、ファイルのリストは次のようになると予想する必要があります。
some_throuwaway_stuff
foo
very_important_file.txt
Yes
some_throuwaway_stuff
foo
スクリプトはおそらく次のようになります。
#!/bin/bash
echo "Give directory to search for ASCII text files"
read direct
exec 3<&0
find "$direct" -type f |
while IFS= read -r name; do
echo "========================================"
if file "$name" | grep ASCII; then
echo "----------------------------------------"
head "$name";
echo "----------------------------------------"
echo "Do you want to delete this file?"
read -u 3 want
case $want in
YES|Yes|yes|Y|y)
rm "$name"
;;
*)
;;
esac
fi
done
リダイレクトはexec 3<&0
定期的にファイル記述子3に提供されstdin
、その後、ユーザーの応答をループで確認します。
つまり、rm -i
これはより良い選択かもしれません。