あるフォルダーから別のフォルダーにファイルを移動することはできますが、問題は、作成された日付とファイル名として新しいフォルダーに新しく作成されたファイルが必要なことです。
例えば
/scripts/a.log
へ移動
/log/8june2012a.log
cp filename "`date +%Y%m%d`filename"
これにより、 filenameが20120608filenameとしてコピーされます。あなたの例では、これはあなたが望むものです:
cp filename "`date +%d%b%Y`filename"
これにより、ファイル名が 08jun2012filename としてコピーされます。mv
コピーする代わりにファイルを移動したい場合は、次の代わりに使用しますcp
。
mv filename "`date +%d%b%Y`filename"
別の解決策。
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;
いくつかの 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 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
これを「scripts」ディレクトリで実行できます。