我有3个文件,test1
,test2
,test3
。
我试图将每个文件的行数和文件名放在一个列表中,然后将该列表放在电子邮件正文中。
这是到目前为止我所掌握的概图。我不确定如何将文件名放入email-body
文件中。我知道如何使用email-body
文本发送电子邮件。
#!/bin/bash
FILE=/home/tst/test-dir/${@:1}
for files in $FILE
do
cat $files |wc >> temp-word-count;
cut -d " " -f 7 temp-word-count > email-body;
done
答案 0 :(得分:1)
如果您只是将离散的文件名作为参数传递给位于/home/tst/test-dir
目录中的脚本,并且希望在email-body
中输入 line-count 和文件名,则您也可以使用一个简单的循环,例如
#!/bin/bash
dir=/home/tst/test-dir
:> email-body ## truncate email-body before each use
for files in "$@" ## loop over arguments
do
wc -l "$dir/$files" >> email-body ## add line-count and name to email
done
使用/输出示例
使用目录$HOME/tmpd
并将脚本调用为:
$ bash tmp/embody.sh afile cmtfile file sfile
导致当前目录中的文件email-body
包含:
$ cat email-body
8 /home/david/tmpd/afile
8 /home/david/tmpd/cmtfile
6 /home/david/tmpd/file
12 /home/david/tmpd/sfile
您的另一种选择(效率会稍微提高一点)是在完成时简单地重定向for
循环的输出一次,例如
#!/bin/bash
dir=/home/tst/test-dir
for files in "$@" ## loop over arguments
do
wc -l "$dir/$files" ## output line-count and name
done > email-body ## single redirect to email at end of loop
这也消除了在循环之前进行截断的需要。 (与email-body
中的输出相同)
答案 1 :(得分:1)
wc
已经为您完成了工作,并列出了具有行数的文件名:
$ wc -l test?
3 test1
6 test2
2 test3
11 total
因此,如果您的文件位于/home/tst/test-dir
中,则可以使用类似的
wc -l /home/tst/test-dir/test? > email-body
答案 2 :(得分:0)
awk '
{ numLines[FILENAME]++ }
END {
for (i=1; i<ARGC; i++) {
fname = ARGV[i]
print fname, numLines[fname]+0
}
}
' "/home/tst/test-dir/${@:1}" > email-body
答案 3 :(得分:0)
可以请您尝试以下内容(未经测试)。
awk '
FNR==1 && prev{
print prev_file, prev
}
FNR==1{
prev_file=FILENAME
}
{
prev=FNR
}
END{
print prev_file, prev
}
' "/home/tst/test-dir/${@:1}" > email-body