【问题标题】:Fast directory clean-up with Perl使用 Perl 快速清理目录
【发布时间】:2015-01-06 13:19:23
【问题描述】:

我需要清理我的网络服务器上包含数百万个日志文件的目录。我找到了this great article 来了解如何做到这一点。然而,我对这一单线有一些有趣的事情。

这是我感兴趣的 Perl 代码:

for(<*>){((stat)[9]<(unlink))}

使用perl -e 'code' 运行。

所以,这是我的问题:

  1. for(&lt;*&gt;) 构造 - 我假设它遍历当前目录中的文件。但是它将迭代器存储在哪里?
  2. statunlink 函数至少需要一个参数,我假设...但是它在哪里?
  3. 为什么将调用(stat)[9] 的结果与调用(unlink) 的结果进行比较?它会产生什么结果?

对不起,我不是 perl-ish 人,因此我不理解所有这些 Perl 缩写。这就是我问这个问题的原因。

谢谢!

【问题讨论】:

  • 我是个不喜欢 perl 的人 我认为这篇文章的作者也不是。这看起来像是从一个管理员传递给另一个管理员的一行代码,在此过程中略有损坏。

标签: linux perl rm


【解决方案1】:

一个班轮走很多捷径:

  1. &lt;*&gt; 是菱形运算符的一个特例。您无法访问迭代器对象,就像在其他语言中一样。在这里,它调用glob 函数。在列表上下文中,它从所有结果中返回一个列表(可以是文件的行,或者在您的情况下,是目录的内容。它的返回值被传递给for,它遍历列表和别名$_ 中的值。$_ 是许多函数的“默认变量”……
  2. 这将我们带到了这里。许多核心函数默认为$_,没有参数。 unlinkstat 也是如此。
  3. (stat)[9] 表示在列表上下文中执行 stat 并选择第 10 个结果(索引从零开始,这是修改时间)。 (将其与 $foo[9] 之类的数组访问进行比较)。

【讨论】:

  • 不错! unlink 的通话结果又是怎么回事?为什么和stat[9]比较???
  • 我看不出有什么原因,unlink 要么返回 1 要么返回 false 值,这取决于成功。也许这是执行这两个命令的一种非常短的方法,但; 应该尽可能简洁。
  • 在 void 上下文中使用 stat 也是完全多余的。如果有修改日期的比较,那将是有道理的。这只会删除所有文件。不妨将其替换为unlink &lt;*&gt;
  • 没有迭代器。 &lt;&gt; 在列表上下文中返回所有结果(readlineglob 版本)。
  • @ikegami:在文档的某些部分中,菱形被称为迭代器。我已经说过你在第三句话中得到所有结果。
【解决方案2】:

代码

for(<*>){((stat)[9]<(unlink))}

相当于:

for my $file (<*>) {
    my $mtime = (stat($file))[9];
    $mtime < unlink($file);
}

&lt;*&gt; 也可以替换为glob "*",这样可能更易读。

代码将删除当前目录中的所有文件。它不会删除目录。

请注意,循环中的最后一条语句是完全多余的。如果use warnings 生效,会给出警告:

Useless use of numeric lt (<) in void context

为了使这段代码有意义,我希望进行真正重要的比较,例如将 $mtime 与某个时间进行比较以了解哪些日志是旧的,例如:

if ($mtime < $oldtime) {
    unlink $file or die "Cannot unlink $file: $!";
}

另请注意,删除文件时检查失败可能是谨慎的做法。

【讨论】:

  • 也可以用 glob "*" 替换,这可能更具可读性。 您应该在答案中使用 glob——因为它是 它看起来像一个文件句柄。
【解决方案3】:
  1. for() 构造 - 我假设它遍历当前目录中的文件。但是它将迭代器存储在哪里?

for-loops 可用于迭代数组/列表,因此如果&lt;*&gt; 生成一个列表,那么您的代码只是 for 循环的运行。事实证明,&lt;*&gt; 是 glob() 的另一种拼写方式,它有点像用于检索文件名的正则表达式,而 glob() 在 list context 中返回一个列表——这是for 循环提供的上下文。请参阅:http://perldoc.perl.org/functions/glob.html

请注意,单引号会阻止 shell 扩展 *,这将阻止 perl 看到它。

【讨论】:

  • shell 不会插入 *
  • @TLP,我无知。 :(
猜你喜欢
  • 2010-12-20
  • 2018-01-25
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多