我可以通过此for循环将行数值旁边的文件名添加到其特定文件吗?

时间:2019-06-05 17:25:55

标签: bash

我有3个文件,test1test2test3

我试图将每个文件的行数和文件名放在一个列表中,然后将该列表放在电子邮件正文中。

这是到目前为止我所掌握的概图。我不确定如何将文件名放入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

4 个答案:

答案 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