perl - 如何使用 Perl 将大于 300KB 的文件移动到不同的位置
问题描述
我有一个 Perl 脚本 ( move_file.pl
) 并且需要添加一个额外的功能。大于 300KB 的文件必须移动到另一个位置,然后脚本应发送电子邮件警告。
如何读取文件的大小并将“较大的文件”移动到不同的位置?
当前移动脚本:
opendir(D, "$source_dir") or mail_die ("Fout bij lezen van directory $source_dir : $!" );
my @allfiles = sort( grep { -f "$source_dir/$_" } readdir D); #Lees alle bestanden uit de huidige werk directory
closedir(D);
my @filelist = grep { !/^.+(\._cpcnv_)$/i } @allfiles; #Alle bestanden die NIET passen in het patroon *._cpcnv_ (Case insensitive)
foreach my $filename (@filelist)
{
my $source_file = "$source_dir/$filename";
my $target_file = "$target_dir/$filename";
rename $source_file , $target_file or mail_die ("Fout bij hernoemen van bestand $source_file naar $target_file : $! \n" );
print "Bestand $source_file verplaatst naar $target_file.\n";
}
debug "Succesvol beeindigd!\n";
exit;
解决方案
这将整理出较大的文件进行一些特殊处理,并在处理过程中更改目标目录:
#!/usr/bin/env perl
use strict;
use warnings;
my($THRESHOLD) = 300 * 1024;
my($SOURCE_DIR) = "/tmp/src";
my($TARGET_DIR) = "/tmp/dst";
my($LARGE_DIR) = "/tmp/bigfiles";
foreach my $filename (@ARGV) {
next if -d $filename;
my($source_file) = "$SOURCE_DIR/$filename";
my($target_file) = "$TARGET_DIR/$filename";
my($size) = (stat($source_file))[7];
$target_file = mail_warn($source_file, $filename, $size) if ($size > $THRESHOLD);
print qq{"TARGET_DIR: "$target_file"\n};
}
sub mail_warn
{
my($source_file, $filename, $size) = @_;
print qq{File "$source_file" too big! [$size]\n};
my($new_target) = "$LARGE_DIR/$filename";
$new_target;
}
一个带有一些虚构数据的小样本:
$ /tmp/foo *
"TARGET_DIR: "/tmp/dst/aaa"
"TARGET_DIR: "/tmp/dst/bbb"
File "/tmp/src/bbb" too big! [3014026]
"TARGET_DIR: "/tmp/bigfiles/bbb"
"TARGET_DIR: "/tmp/dst/ccc"
File "/tmp/src/ddd" too big! [501130]
"TARGET_DIR: "/tmp/bigfiles/ddd"
"TARGET_DIR: "/tmp/dst/eee"
推荐阅读
- java - Spring Boot 应用程序中聚合 SQL 函数的问题
- postgresql - 是否可以在没有 Struct 的情况下反序列化 tokio_postgres 行?
- python - 使用 tensorflow 构建自定义模型时无法获取摘要
- extjs - ExtJS 6 如何捕获动态无线电组或复选框组上的选择
- javascript - 根据下拉选择展开表格行
- git - 我是 git 新手。我通过观看在线视频开始安装,但显示错误。致命:pathspec 'index.html' 不匹配任何文件
- reactjs - React Material-UI 表单处理
- javascript - 不变违规:“main”尚未注册
- java - Eclipse 错误:无法创建 Java 虚拟机。发生了致命异常。程序将会退出
- php - 传递给 Symfony\Bridge\Doctrine\Form\ChoiceList\IdReader::getIdValue() 的参数 1 必须是一个对象或 null,int 给定