Câu hỏi Làm thế nào để đổi tên các tập tin theo lô với lệnh đổi tên Unix?


Tôi có các tệp có tên giống như sau:

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

Những gì tôi muốn làm là thay thế tất cả indel với snp trong các tên năng suất

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

Nhưng tại sao lệnh unix này không hoạt động?

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

6
2018-03-06 14:02


gốc


Tôi không thể xem tài liệu để đổi tên đề cập đến hỗ trợ cho các lệnh như 's / indel / snp /', bạn đang sử dụng tiện ích đổi tên nào? - nos
Có vẻ như OP đang đề cập đến man.cx/prename - jamessan
Gì doesn't work về lệnh đó? bạn đang nhận được một lỗi? Nó không thay đổi tên tập tin? Thứ gì khác? - jamessan


Các câu trả lời:


Vì bạn đang sử dụng chương trình đổi tên sai. Đây là một trong những quyền.


5
2018-03-06 14:39



Nếu nó không có trên CPAN (1, 2, 3, 4, 5), nó có thể cũng không tồn tại. - daxim
@daxim: CPAN ghét các chương trình. - tchrist
Bạn không hợp lý. - daxim


Bình thường" rename tiện ích (một phần của util-linux) có 3 hoặc nhiều đối số (như đã đề cập trong TFM ..)

rename FROM TO filespec...

Vì vậy, bạn đang (có thể) đang tìm kiếm:

rename .indel. .snp. *.sam

Kiểm tra điều này trên một thư mục đầu tiên, vì bạn có thể đang sử dụng một triển khai thực hiện khác rename.

Hoặc kiểm tra trang người đàn ông. ho


4
2018-03-06 14:14



1 cho không ngay lập tức nhảy đến regexes. :) Nhưng bạn có thể muốn các dấu chấm xung quanh indel và snp, nên những con đường như blah.stuffindelsomeotherstuff.x cũng không được thay đổi. - cHao
Điểm tốt. Thêm. - Simon


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

2
2018-03-06 14:16



Tại sao ls -1 | while read item thay vì for item in *.sam? - cHao
@ user280476: mã của bạn sẽ làm những điều kỳ lạ nếu bạn có tệp có dấu cách trong tên.
… Hoặc một số lượng lớn tệp. - JdeBP


rename không làm sedthay thế kiểu. Kịch bản Perl rất ngắn này sẽ cho phép bạn thực hiện 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";
}

0
2018-03-06 14:11