.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
파일이 없는 상황을 처리하는 첫 번째 문제는 nullglob
bash의 기능을 사용하여 해결할 수 있습니다. 설명된 대로 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