加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

用Bash或Perl重命名和移动文件

发布时间:2020-12-15 22:49:42 所属栏目:安全 来源:网络整理
导读:嗨,我对 Bash和StackOverflow完全不熟悉. 我需要将一组文件(全部包含在同一文件夹中)移动到目标文件夹,其中可能已存在具有相同名称的文件. 如果存在特定文件,我需要在移动文件之前重命名该文件,方法是在文件名后附加一个增量整数. 应保留扩展名(换句话说,附
嗨,我对 Bash和StackOverflow完全不熟悉.

我需要将一组文件(全部包含在同一文件夹中)移动到目标文件夹,其中可能已存在具有相同名称的文件.

如果存在特定文件,我需要在移动文件之前重命名该文件,方法是在文件名后附加一个增量整数.

应保留扩展名(换句话说,附加的增量整数应该在扩展名之前).文件名可以包含中间的点.

最初,我正在考虑比较两个文件夹以获得现有文件的列表(我用“comm”做了这个),但后来我有点卡住了.我想我只是想以最复杂的方式做事.

有什么暗示以“bash方式”做到这一点?如果它是在bash脚本以外的脚本中完成的,那就没关系.

解决方法

根据OP,这可以是Perl,而不仅仅是bash.开始了

新解决方案:(注意扩展)

~/junk/a1$ls
f1.txt   f2.txt   f3.txt   z1       z2


~/junk/a1$ls ../a2
f1.txt     f2.1.txt   f2.2.txt   f2.3.txt   f2.txt     z1

# I split the one-liner into multiple lines for readability
$perl5.8 -e 
     '{use strict; use warnings; use File::Copy; use File::Basename; 
       my @files = glob("*"); # assume current directory
       foreach my $file (@files) {
           my $file_base2 = basename($file); 
           my ($file_base,$ext) = ($file_base2 =~ /(.+?)([.][^.]+$)?$/);
           my $new_file_base = "../a2/$file_base";
           my $new_file = $new_file_base . $ext; 
           my $counter = 1;
           while (-e $new_file) { 
               $new_file = "$new_file_base." . $counter++ . $ext;
           }
           copy($file,$new_file)
               || die "could not copy $file to $new_file: $!n";
        } }'

~/junk/a1> ls ../a2
f1.1.txt f1.txt  f2.1.txt  f2.2.txt  f2.3.txt  f2.4.txt  f2.txt  f3.txt
z1         z1.1       z2

旧解决方案:(不注意扩展)

~/junk/a1$ls
f1   f2   f3

~/junk/a1$ls ../a2
f1     f2     f2.1   f2.2   f2.3

# I split the one-liner into multiple lines for readability
$perl5.8 -e 
     '{use strict; use warnings; use File::Copy; use File::Basename; 
       my @files = glob("*"); # assume current directory
       foreach my $file (@files) {
           my $file_base = basename($file); 
           my $new_file_base = "../a2/$file_base"; 
           my $new_file = $new_file_base; 
           my $counter = 1;
           while (-e $new_file) { $new_file = "$new_file_base." . $counter++; }
           copy($file,$new_file)
               || die "could not copy $file to $new_file: $!n";
        } }'

~/junk/a1> ls ../a2
f1     f1.1   f2     f2.1   f2.2   f2.3   f2.4   f3

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读