1

あるフォルダーから別のフォルダーにファイルを移動することはできますが、問題は、作成された日付とファイル名として新しいフォルダーに新しく作成されたファイルが必要なことです。

例えば

/scripts/a.log

へ移動

/log/8june2012a.log
4

6 に答える 6

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

これにより、 filename20120608filenameとしてコピーされます。あなたの例では、これはあなたが望むものです:

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

これにより、ファイル名が 08jun2012filename としてコピーます。mvコピーする代わりにファイルを移動したい場合は、次の代わりに使用しますcp

mv filename "`date +%d%b%Y`filename"
于 2012-06-08T06:22:56.017 に答える
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 に答える
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 に答える
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

これを「scripts」ディレクトリで実行できます。

于 2012-06-08T06:21:56.063 に答える