在unix中创建连接文件,然后在同一个脚本中将该文件邮寄给您

时间:2015-01-02 14:59:00

标签: bash shell unix scripting

我正在尝试创建一个脚本,它将连接目录out.*中的所有/home/rfranklin/stackDump/文件,然后将该连接文件传递给mailx命令 - 所以我可以将它邮寄给自己

到目前为止,我尝试了两种方法,但它们似乎都没有工作。希望有人能告诉我原因!

目前在/home/rfranklin/stackDump/目录中我有文件:

out.file1
out.file2
out.file3
out.file4
otherfile.txt
otherfile2.txt

首先,我尝试编写for循环:

#!/bin/bash
#
OUT_FILES_DIRECTORY="/home/rfranklin/stackDump/out.*"

for file in $OUT_FILES_DIRECTORY
do
cat $file > stack_dump_`date +%Y%m%d` | mailx -s stack_dump_`date +%Y%m%d` rfranklin@gmail.com
done

返回:

Null message body; hope that's ok
Null message body; hope that's ok
Null message body; hope that's ok
Null message body; hope that's ok

我收到4封空白电子邮件。但是创建了连接文件,所以我知道有些工作正在进行中。

接下来我尝试使用这里的文档:

#!/bin/bash
#
bash <<'EOF'
cd /home/rfranklin/stackDump 
cat out.* > stack_dump_`date +%Y%m%d` | mailx -s stack_dump_`date +%Y%m%d` rfranklin@gmail.com
done
EOF

这对我也不起作用。我哪里错了!

由于

3 个答案:

答案 0 :(得分:1)

您可以使用tee

#!/bin/bash    

d=$(date +%Y%m%d)
for file in /home/rfranklin/stackDump/out.*
do
    cat "$file" | tee -a "stack_dump_$d" | mailx -s "stack_dump_$d" rfranklin@gmail.com
done

tee将标准输入复制到文件以及标准输出。 -a选项附加到文件而不是覆盖它。

在原始版本的脚本中,>cat的输出重定向到文件,这意味着mailx的管道为空。

我假设你的脚本不会运行超过一天,所以我已经将调用移到了date循环之外。

答案 1 :(得分:1)

我没有看到在这里创建文件的重点,您可以轻松地将cat的输出管道传输到mailx

cat /home/rfranklin/stackDump/out.* |
 mailx -s "stack_dump_$(date +%Y%m%d)" rfranklin@gmail.com

如果您更喜欢邮件正文中的内容附件

cat /home/rfranklin/stackDump/out.* |
uuencode "stack_dump_$(date +%Y%m%d)" |
mailx -s "stack_dump_$(date +%Y%m%d)" rfranklin@gmail.com

答案 2 :(得分:0)

据我所知,您希望将给定目录中的所有文件连接到一个文件中,然后将其邮寄给您自己。如果我错了,请纠正我。

首先将所有文件连接成一个:

 cat /home/rfranklin/stackDump/out.* > concatFile

然后邮寄给自己:

dat=$(date +%Y%m%d)
mail -s "stack_dump_$dat" rfranklin@gmail.com < concatFile

修改

你可以把它放在一个脚本中:

dir=$1
cat $dir/out.* > concatFile
dat=$(date +%Y%m%d)
mail -s "stack_dump_$dat" rfranklin@gmail.com < concatFile

按原样运行:

./script /home/rfranklin/stackDump

将在您当前的目录中创建concatFile