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

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

나는 당신이 지적한 디렉토리에서 모든 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

관련 정보