如何使用 Unix 重命名命令批量重命名文件?

如何使用 Unix 重命名命令批量重命名文件?

我有一些文件,其名称如下:

Sim1-2_40.36.chr20_sb.foo.indel.novoalign.sam
Sim1-2_40.36.chr20_sb.foo.indel.bwa.sam

我想要做的是将名称中的所有indel内容替换为snp

Sim1-2_40.36.chr20_sb.foo.snp.novoalign.sam
Sim1-2_40.36.chr20_sb.foo.snp.bwa.sam

但是为什么这个unix命令不起作用?

$ rename 's/indel/snp/' *.sam

答案1

因为您使用了错误的重命名程序。 这是正确的。

答案2

“正常”rename实用程序(的一部分util-linux)需要 3 个或更多参数(如 TFM 中提到的..)

rename FROM TO filespec...

因此,您(可能)正在寻找:

rename .indel. .snp. *.sam

首先在临时目录上测试这一点,因为您可能正在使用 的另一种实现rename

或者检查手册页。 咳嗽

答案3

ls -1 | while read item
do
  mv $item $(echo $item|sed -e s/.indel./.snp./g);
done

答案4

rename不执行sed-style 替换。这个非常简短的 Perl 脚本将允许您执行以下操作regmv *.sam s/indel/snp/

#!/usr/bin/perl -w
#
# regmv - Rename files using a regular expression
#
# This program renames files by using a regular expression to
# determine their new name.
#
# Usage: regmv file [file ...] regexp
#
# $Id: regmv,v 1.1 1998/10/14 17:07:55 blrfl Exp $
#

sub at_clean()
{
    my $message = $@;
    $message =~ s|\s+at /.*$||s;
    return $message;
}

(@ARGV > 1)
    || die "Usage: regmv [options] file [file ...] regexp\n";

my $expr = pop @ARGV;

$_ = 'SomeValue';
eval "\$_ =~ $expr";
die "Yuck: " . at_clean() if $@;

foreach (@ARGV)
{
    my $old = $_;

    eval "\$_ =~ $expr";

    next if $_ eq $old;

    (rename $old, $_)
        || die "Rename failed: $!\n";
}

相关内容