在下面的脚本中。我无法更改目录。我需要像该目录中70%以上的磁盘一样消耗更多空间。
#!/usr/bin/perl
use strict;
use warnings;
my $test=qx("df -h |awk \+\$5>=70 {print \$6} ");
chdir($test) or die "$!";
print $test;
system("du -sh * | grep 'G'");
答案 0 :(得分:3)
无需在您的情况下调用awk
,因为Perl非常善于分割和打印某些行本身。您的代码存在一些问题:
代码qx("df -h |awk \+\$5>=70 {print \$6} ")
尝试执行 字符串 "df -h | awk ..."
作为失败的命令,因为没有名为{的命令{1}}。当我运行该代码时,我得到"df -h | awk"
。您可以通过删除引号sh: 1: df -h |awk +>=70 {print } : not found
来解决此问题,因为"
已经 引用。变量qx()
之后为空,因此$test
会更改为chdir
目录。
然后您会看到下一个错误:$HOME
,因为它会调用awk: line 1: syntax error at or near end of line
。正确的是awk +\$5>=70 {print \$6}
,即awk '+\$5>=70 {print \$6}'
小脚本周围有'
个刻度。
正如评论中所述,awk
将长行拆分为两行。例如:
df -h
使用Filesystem 1K-blocks Used Available Use% Mounted on
/long/and/possibly/remote/file/system
10735331328 10597534720 137796608 99% /local/directory
获得有保证的列顺序和一行输出。
最后一次df -hP
调用显示包含字母system
的所有行的目录用量(空格)。我估计这不完全是你想要的。
我建议使用以下Perl脚本:
G
答案 1 :(得分:2)
#!/usr/bin/perl
use strict;
use warnings;
my @bigd = map { my @f = split " "; $f[5] }
grep { my @f = split " "; $f[4] =~ /^(\d+)/ && $1 >= 70}
split "\n", `df -hP`;
print "big directories: $_\n" for @bigd;
for my $bigd (@bigd) {
chdir($bigd);
my @bigsubd = grep { my @f = split " "; $f[0] =~ /G/ }
split "\n", `du -sh *`;
print "big subdirectories in $bigd:\n";
print "$_\n" for @bigsubd;
}
我相信你想做这样的事情。