2012-06-08 7 views
1

Я могу перемещать файлы из одной папки в другую, но проблема в том, что я хочу, чтобы новый созданный файл в новой папке был создан как дата создания и имя файла.Переместить файлы в другую папку, включая дату создания в filename

Например

/scripts/a.log 

переехал в

/log/8june2012a.log 
+0

, когда вы задаете вопрос, вы должны опубликовать то, что вы пробовали до сих пор. – tuxuday

ответ

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" 
+0

Он фактически не копирует файл. Он перемещает его. +1 для решения короткой оболочки. – simbabque

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

Ваша функция get_timestamp должна генерировать дату.

+0

спасибо sakura , но функция get_timestamp дает текущую дату, когда я хочу дату в качестве даты создания a.файл журнала говорит, что он был создан на 06june2012, и я обрабатываю этот скрипт сегодня. Мне нужен файл как 06june2012a.log. –

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 

вы можете запустить в папке «сценарии».

2

Используя пару модулей CPAN это можно сделать простым. File::Copy был основным модулем с Perl версии 5.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; 
} 
+0

+1 для отображения преимуществ стандартного формата% Y% m% d – daxim

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 (ггггммдд), поскольку это дает последовательный формат и позволяет сортировать по дате более легко.

+0

'(stat $ infile) [9]' выбирает дату изменения файла. Вам нужно '(stat $ infile) [10]' для даты создания. Или 'используйте File :: stat' и напишите' stat ($ infile) -> ctime'. – Borodin

+0

@Borodin, ctime - это не время создания. От ** perldoc -f stat ** - ** 10 ctime inode время изменения в секундах с эпохи (*) ** – tuxuday

+0

@tuxuday: ах спасибо. Помню, я знал это несколько лет назад! – Borodin

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; 
+0

За исключением вопроса, как переместить все файлы в один каталог на другой, а также переименовать их, чтобы включить дату создания. – Borodin

+0

Вопрос читает ** Я могу перемещать файлы из одной папки в другую, но .. ** – tuxuday

Смежные вопросы