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