我可以将文件从一个文件夹移动到另一个文件夹,但问题是我希望新文件夹中新创建的文件作为其创建日期和文件名。
例如
/scripts/a.log
搬去
/log/8june2012a.log
cp filename "`date +%Y%m%d`filename"
这会将文件名复制为20120608filename。对于您的示例,这就是您想要的:
cp filename "`date +%d%b%Y`filename"
这会将文件名复制为08jun2012filename。如果你想移动你的文件而不是复制使用mv
而不是cp
:
mv filename "`date +%d%b%Y`filename"
使用几个 CPAN 模块,这可以很简单。File::Copy
自 Perl v5.0 以来一直是核心模块,但除非您已经拥有它们,否则需要安装它们Date::Format
。Path::Class
我已经从字面上理解了您的要求,并且此解决方案使用创建日期%e%B%Y
作为格式为原始文件添加前缀,将大写转换为小写并去除空格。然而,这不是很可读,目录列表不会自动按日期顺序排序,所以我建议使用%Y-%m-%d-
替换包含调用的strftime
行
my $date = lc strftime('%Y-%m-%d-', @date)
目前,该代码仅打印将要移动的文件及其目的地的列表。要实际执行此操作,您应该取消对move
.
use strict;
use warnings;
use Path::Class 'dir';
use Date::Format 'strftime';
use File::Copy 'move';
my $source = dir '/scripts/';
my $dest = dir '/log/';
for my $file (grep { not $_->is_dir } $source->children) {
my @date = localtime $file->stat->ctime;
(my $date = lc strftime('%e%B%Y', @date)) =~ tr/\x20//d;
my $newfile = $dest->file($date.$file->basename);
print "move $file -> $newfile\n";
# move $file, $newfile;
}
这是 Perl 中的一个解决方案。
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy 'move';
use Time::Piece 'localtime';
my $indir = '/scripts';
my $outdir = '/log';
# get all of the files in the scripts dir
chdir $indir;
my @files = grep -f, glob '*';
foreach my $infile (@files) {
# get the date that the file was created
my $file_created_date = localtime( (stat $infile)[9] );
my $outfile = $file_created_date->strftime('%d%B%Y').$infile;
move $infile, "$outdir/$outfile";
}
顺便说一句,我会将日期格式化为%Y%m%d
(yyyymmdd),因为它为您提供了一致的格式并允许您更轻松地按日期排序。
另一种解决方案。
use strict ;
use File::stat ;
use POSIX qw(strftime);
my $File = 'mv.pl';
my $NewFile=strftime("%d%B%Y",localtime(stat($File)->ctime)) . $File ;
rename $File, $NewFile;
use File::Copy;
move("a.log",$DIRECTORY.get_timestamp().".log");
您的 get_timestamp 函数应该生成日期。
我为你写了一个演示,
#!/bin/bash
DATE=`date +"%e%B%Y" | tr -d ' ' | tr A-Z a-z`
for FILENAME in *.log
do
cp "${FILENAME}" "/log/${DATE}${FILENAME}"
done
您可以在“脚本”目录中运行它。