复制而不覆盖并保留具有扩展名的现有文件

时间:2016-08-19 07:09:51

标签: perl unix

我需要复制具有特定扩展名的文件。但问题是有多个文件具有相同的文件名。我不想覆盖它们并存储为文件_1,file_2等副本当我尝试使用unix命令行时文件被覆盖虽然我使用了cp -n。 有什么办法可以使用命令行或perl来完成这项任务吗? 我使用的命令是

  

找-L。 -name" * .txt" -exec cp -n {} -t~ / destination

3 个答案:

答案 0 :(得分:2)

您还可以使用cp --backup=numbered选项。

答案 1 :(得分:1)

在Perl中(未经测试)

perl -MFile::Copy=cp -e '-e ($n = "~/destination/$_") or cp $_, $n for @ARGV' *.txt

答案 2 :(得分:-1)

下面的perl脚本以递归方式查找文件并复制到目标文件夹中,但如果已存在,则会将文件重命名为filename_1,filename_2

#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use File::Spec::Functions qw'catfile';
use File::Copy qw'move';
#use autodie    qw'move';
use File::Basename;

my ($filename);#    = 'DUMBFILE';
my $origin      = '/home/itadmin/FoldersFind/OriginalFolder';
my $destination = '/home/itadmin/FoldersFind/Destination';

mkdir($destination, 0777); 
my ($path);
find(\&wanted, $origin);

sub wanted
{
    if(-e $origin)
    {
        if($File::Find::name=~m/\.(txt|html|xml)$/gs)
        {
            $filename = basename($File::Find::name);
        }
    }
    $path = "$destination/$filename";
    my $cnt;
    while(-e $path)
    {
        $cnt++;
        $path = catfile $destination, "$filename.$cnt";
    }
    move($filename, $path);
}

输入:(提取文件可能重复)

/OriginalFolder/<folders1>/*file
/OriginalFolder/<folders2>/*file

输出:(重命名)

/Destination/*file_<count> #/Destination/*file_1
/Destination/*file_<count> #/Destination/*file_2