텍스트 파일을 삭제하는 스크립트

텍스트 파일을 삭제하는 스크립트

지적하신 디렉터리에서 모든 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개 파일(내 디렉터리에 4개 파일이 있음)의 처음 10줄과 "이 파일을 삭제하시겠습니까?"라는 질문입니다. 그런 다음 스크립트가 중단됩니다.

예상대로 작동하지 않는 것 같습니다. 누군가 내가 어디로 잘못 가고 있는지 설명해 줄 수 있습니까?


좋아요, 제가 직접 답변할 만큼 평판이 좋지 않아서 여기에 넣겠습니다.


예, 그래서 $$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주기적으로 파일 설명자 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

관련 정보