1

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

例如

/scripts/a.log

搬去

/log/8june2012a.log
4

6 回答 6

5
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"
于 2012-06-08T06:22:56.017 回答
2

使用几个 CPAN 模块,这可以很简单。File::Copy自 Perl v5.0 以来一直是核心模块,但除非您已经拥有它们,否则需要安装它们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;
}
于 2012-06-08T07:31:40.133 回答
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),因为它为您提供了一致的格式并允许您更轻松地按日期排序。

于 2012-06-08T07:32:11.203 回答
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;
于 2012-06-08T07:49:01.200 回答
0
use File::Copy;
move("a.log",$DIRECTORY.get_timestamp().".log");

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

于 2012-06-08T06:04:05.560 回答
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

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

于 2012-06-08T06:21:56.063 回答