Bash: 쉘 스크립트는 전달된 모든 인수와 일치하는 파일을 삭제합니까?

Bash: 쉘 스크립트는 전달된 모든 인수와 일치하는 파일을 삭제합니까?

이것은 숙제 질문이므로 답변이나 스크립트를 직접 찾고 있지 않습니다. 그래서 내 질문 중 하나에서 다음을 포함하는 파일을 삭제하라는 요청을 받았습니다.어느명령줄 인수가 전달되었습니다. 이것은 스크립트 조각입니다.

#!/bin/sh

#some more stuff here

for args in "$@"; do
    if  [ $#  != 0 ]; then
        grep -l $args * | while read theFile; 
        do
            if [ -f "$theFile" ] ; then
                rm "$theFile"
                echo "$theFile is deleted with $args match"
            else
                echo "$theFile not deleted"
                exit 2
            fi
        done #end of while loop
    else 
        echo "No match found with $args"
        exit 1
    fi
    done
echo "DONE"
exit 0 

이제 나는 알고 싶다다음과 같은 파일을 제거하도록 스크립트를 어떻게 작성합니까?모두논쟁? 각 파일에 for 루프를 통해 전달된 매개변수가 있는지 확인해야 한다는 것을 알고 있지만 작성 방법을 잘 모르겠습니다. 어떤 조언이라도 대단히 감사하겠습니다.

해당 정보가 필요하시면 연습용으로 cloud9을 사용하고 있습니다.

답변1

이제 키워드( )를 반복 for arg in..하고 각 키워드에 대해 해당 키워드( grep -l $arg *)가 포함된 파일을 확인합니다.

모든 키워드가 포함된 파일을 확인하려면 이를 되돌리고 모든 파일을 반복( for f in *)한 다음 키워드를 반복( for arg in "$@")하고 파일에 해당 키워드가 포함되어 있는지 확인( grep -qe "$arg" "$f")하고 모든 파일이 삭제와 일치하는 경우에만 삭제할 수 있습니다.

당신이 그렇게 할 것이기 때문에 그것은 약간 폭력적입니다grep N*시간, ...에 대한N파일과핵심 단어. 또 다른 접근 방식은 grep -l첫 번째 키워드를 실행한 다음 grep -l두 번째 키워드를 실행하여 grep마지막 grep에서 반환된 파일 목록을 제공하는 등의 방식입니다. 각 단계에서 파일 목록을 배열로 저장할 수 있습니다.


참고로 이것은 말이 되지 않습니다:

for args in "$@"; do
    if  [ $#  != 0 ];

각 인수에 대해 한 번씩 실행되는 루프 내에서 숫자 인수를 확인하고 있습니다. $#인수가 없으면 정확히 0이지만 "$@"아무것도 포함하지 않고 루프가 실행되지 않습니다.

여기:

grep -l $args * | while read theFile; 

아마도 인용해야 할 수도 $args있고, 다음을 보고 싶을 수도 있습니다.배쉬 FAQ 001사용에 대한 정보 while read...

간단히 말해서, 당신은 아마 원할 것입니다

grep -l "$args" * | while IFS= read -r theFile; do

관련 정보