刪除文字檔案的腳本

刪除文字檔案的腳本

我試圖製作一個腳本來搜尋您指出的目錄中的所有 ASCII 文字文件,然後將每個文件的路徑寫入文字檔案。之後它應該一一顯示每個文件的頭部並詢問您是否要刪除該文件。如果您說“是”,它會刪除該文件,如果您說其他內容,它只會向您顯示下一個文件,依此類推,直到您檢查每個文件。所以我最終得到的是:

#!/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 個檔案的前 10 行(我的目錄中有 4 個檔案)和問題“你想刪除這個檔案嗎?”然後腳本就中斷了。

似乎它沒有按預期工作。有人可以解釋一下我的錯誤在哪裡嗎?


好吧,因為我沒有足夠的聲譽來回答自己,所以我把它放在這裡。


是的,所以我堅持使用我的舊腳本,在將兩個$$ 像$$numb 放在一起時遇到問題,並將它們替換為${!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

附言。使其更快刪除sleep 1=)

答案1

問題是您正在讀取文件實例read- 一個用於讀取文件名,另一個用於獲取答案。因此,read等待答案會佔用第二個檔案名,您應該希望檔案清單看起來不像:

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將定期提供stdin給檔案描述符 3,然後在循環中檢查該檔案描述符以取得使用者的答案。

也就是說,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

相關內容