テキストファイルを削除するスクリプト

テキストファイルを削除するスクリプト

私は、あなたが指摘したディレクトリ内のすべての 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おそらくより良い選択肢です。

答え2

ブロックを交換できます

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

による

while [ $numb -gt 0 ]
do
    head ${!numb}
    rm -i ${!numb}
    numb=$[$numb-1]
done

関連情報