새 파일을 복사하고 이메일 보내기

새 파일을 복사하고 이메일 보내기

.beta한 디렉토리에서 다른 디렉토리로 확장자를 가진 모든 파일을 복사한 후 다음 형식으로 이메일을 보내고 싶습니다 .

The following files have been moved from directory A to Directory B: 
1. la.beta
2. pa.beta

해당 파일을 찾아서 성공적으로 이동한 경우에만 이메일을 보내야 합니다.

이것이 내가 지금까지 가지고 있는 것입니다. 이 스크립트의 문제점은 파일을 찾을 수 없으면 다음과 같은 오류가 발생한다는 것입니다.

mv: cannot stat `/home/zaree/*.beta': No such file or directory`  

그리고 파일이 이동되지 않았음에도 이메일이 옵니다.

#!/usr/bin/env bash
FROM_DIR='/home/zaree'
TO_DIR='/home/zaree/test'

FILE_FOUND=0

BODY=$(printf "$(date)\n\n")
BODY+=$(printf "The following files have been moved from\n")
BODY+=$(printf "%s\nto\n%s\n\n" "$FROM_DIR" "$TO_DIR")

for FILE in /home/zaree/*.beta; do
                FILE_FOUND=1
        mv $FILE /home/zaree/test
        BODY+=$(printf "%s moved\n" "$FILE");
done

{
if (( $FILE_FOUND==1 )); then
        printf  "$BODY"
fi
} | mailx -s "Dev-Script" [email protected]

답변1

다음 줄을 앞에 추가하세요 for FILE in....

shopt -s nullglob

이렇게 하면 파일을 찾지 않고 루프에 한 번 들어가는 것을 방지할 수 있습니다. 귀하의 경우 루프가 입력되고 *.beta명령 mv은 루프를 *.beta대상 디렉터리로 이동하려고 시도합니다.

다음은 부품이 라인에 가장 잘 추가되어 1과 같을 때만 실행된다는 것입니다.| mailx -s "Dev-Script" [email protected]printf $BODY$FILE_FOUND

답변2

파일이 없는 상황을 처리하는 첫 번째 문제는 nullglobbash의 기능을 사용하여 해결할 수 있습니다. 설명된 대로 man bash:

빈 공

설정된 경우, bash는 어떤 파일과도 일치하지 않는 패턴(위의 경로 이름 확장 참조)이 자신이 아닌 빈 문자열로 확장되도록 허용합니다.

더 나은 접근 방식은 루프를 전혀 사용하지 않는 것입니다. 대신에&&||운영자이메일 전송 시기를 제어합니다. 다음과 같이 스크립트를 단순화할 수 있습니다.

#!/usr/bin/env bash
FROM_DIR='/home/zaree'
TO_DIR='/home/zaree/test'

## Prepare the message. You can collect all the names
## here directly. The cat -n adds line numbers.
BODY=$(cat<<EOF
$(date)
The following files have been moved from
$FROM_DIR to $TO_DIR:
$(printf "%s\n" "$FROM_DIR"/*.beta | cat -n)
EOF
       )
mv "$FROM_DIR"/*.beta "$TO_DIR" 2>/dev/null && 
    printf "%s\n" "$BODY" | mailx -s "Dev-Script" [email protected] || 
    echo "No files found" >&2

관련 정보