将文件移动到另一个文件夹,包括创建日期的文件名

时间:2012-06-08 05:54:45

标签: linux perl shell scripting

我能够将文件从一个文件夹移动到另一个文件夹,但问题是我希望新文件夹中新创建的文件为其创建的日期和文件名。

例如

/scripts/a.log

转移到

/log/8june2012a.log

6 个答案:

答案 0 :(得分:5)

cp filename "`date +%Y%m%d`filename"

文件名复制为 20120608文件名。对于你的例子,这就是你想要的:

cp filename "`date +%d%b%Y`filename"

文件名复制为 08jun2012filename 。如果您想移动文件而不是复制,请使用mv代替cp

mv filename "`date +%d%b%Y`filename"

答案 1 :(得分:2)

使用几个CPAN模块可以直接进行。自Perl v5.0以来,File::Copy一直是核心模块,但除非您已经拥有它们,否则需要安装Date::FormatPath::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;
}

答案 2 :(得分:2)

这是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),因为它为您提供了一致的格式,并允许您更轻松地按日期排序。

答案 3 :(得分:2)

另一种解决方案。

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;

答案 4 :(得分:0)

use File::Copy;
move("a.log",$DIRECTORY.get_timestamp().".log");

你的get_timestamp函数应该生成日期。

答案 5 :(得分:0)

我为你写了一个演示,

#!/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

您可以在“脚本”目录中运行它。