我試圖製作一個腳本來搜尋您指出的目錄中的所有 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