Shell脚本循环和Perl打印额外线

时间:2017-04-21 14:34:22

标签: perl shell loops while-loop

我修改了一张海报从另一块板上给我的脚本,以更好地满足我的需求。 InputConfig.txt包含用于查找文件的目录,入站文件年龄(第二列)和出站文件年龄(第三列)。每个目录的这些入站/出站号码不必相同,我只是这样做了。最重要的是VI和AB目录有特定的年龄要检查,其他一切都使用通用的30分钟。

Perl语句的目的是捕获找到的每个文件的时间戳。问题是<html> <h:body> #{label.value} </h:body> </html> 增加了一条线,因为while循环读取3行,但我只需要2行(或多行)来打印。

我不太了解Perl,如果问题出在Perl上,就不能解决它。

感谢帮助。

InputConfig.txt

printf

脚本

/home/MF/NA/CD 30 30
/home/MF/NA/CD/VI 10 10
/home/MF/NA/CD/AB 15 15

输出:

#!/bin/ksh

VI=*/CD/VI/*
AB=*/CD/AB/*

cat InputConfig.txt | while read DIR IT OT; do
TS=$(find "${DIR}" -type f -path "${DIR}/*/inbound/*" -mmin "+${IT}" ! -path "${VI}" ! -path "${AB}")
TS=$(find "${DIR}" -type f -path "${DIR}/*/outbound/*.done" -mmin "+${OT}")
TS=$(find "${DIR}" -type f -path "${DIR}/inbound/*" -mmin +"${IT}")
perl -e 'printf("%s,%d\n", $ARGV[0], (stat("$ARGV[0]"))[9]);' "$TS" 
done

期望输出

,0
/home/MF/NA/CD/VI/inbound/vis,1492716168
/home/MF/NA/CD/AB/inbound/abc,1492716485

3 个答案:

答案 0 :(得分:3)

脚本有很多问题:

  • 它为TS变量分配3x行,因此,只会使用最后一个变量。 find的前两次运行是没有意义的 - 所以你可能想要实现别的东西。
  • 您使用mtime获取perl。如果您将从stdin读取文件名而不是开始perl X次,这是一个很酷的主意。在这种情况下,使用stat shell命令会更快 - 换句话说,您希望从stdin读取文件名。
  • 始终使用read -r(除非您知道为什么不想要-r):))
  • 无用地使用cat。只需重定向文件中的整个循环输入

因此,脚本可能看起来像:

#!/bin/ksh

VI=*/CD/VI/*
AB=*/CD/AB/*

while read -r DIR IT OT; do
    find "${DIR}" -type f -path "${DIR}/*/inbound/*" -mmin "+${IT}" ! -path "${VI}" ! -path "${AB}" -print
    find "${DIR}" -type f -path "${DIR}/*/outbound/*.done" -mmin "+${OT}" -print
    find "${DIR}" -type f -path "${DIR}/inbound/*" -mmin +"${IT}" -print
done < InputConfig.txt | perl -lne 'printf "%s,%d\n", $_, (stat($_))[9];'

这是ksh和/或shell问题perl。 :)

答案 1 :(得分:0)

如果我已经很好理解,你想使用perl来显示以前的find命令找到的文件的名称和大小。这样的事情应该有效:

#!/bin/ksh

VI=*/CD/VI/*
AB=*/CD/AB/*

cat InputConfig.txt | while read DIR IT OT; do
(find "${DIR}" -type f -path "${DIR}/*/inbound/*" -mmin "+${IT}" ! -path "${VI}" ! -path "${AB}" ;
find "${DIR}" -type f -path "${DIR}/*/outbound/*.done" -mmin "+${OT}" ;
find "${DIR}" -type f -path "${DIR}/inbound/*" -mmin +"${IT}") |
xargs -l perl -e 'printf("%s,%d\n", $ARGV[0], (stat("$ARGV[0]"))[9]);'
done

答案 2 :(得分:0)

感谢大家的意见,但我回到原来的if-else脚本方法,因为我调用脚本的TIBCO项目并不喜欢输出格式。

我的脚本,调用类似于./CDFindFiles /home/NA/CD/

#!/bin/ksh

FOLDER=$1
VI=*/CD/VI/inbound
AB=*/CD/AB/inbound

find "$FOLDER" -type f -path "${FOLDER}*/inbound/*" -o -path "${FOLDER}*/outbound/*.done" | while read line;
 do
  MODTIME=$(perl -e 'printf "%d\n",(-M shift)*24*60' "$line")
  if [[ "$line" == *"$VI"* && "$MODTIME" -gt 90 || "$line" == *"$AB"* && "$MODTIME" -gt 180 ]]; then
   perl -e 'printf("%s,%d\n", $ARGV[0], (stat("$ARGV[0]"))[9]);' "$line"
  elif [[ "$line" != *"$VI"* && "$line" != *"$AB"* &&  "$MODTIME" -gt 30 ]]; then
    perl -e 'printf("%s,%d\n", $ARGV[0], (stat("$ARGV[0]"))[9]);' "$line"
   fi
 done