Điểm:2

Làm cách nào để đổi tên hàng loạt các số có tiền tố tuần tự thành các tiền tố tuần tự mới qua thiết bị đầu cuối?

lá cờ ng

Làm cách nào tôi có thể đổi tên hàng loạt, bằng cách sử dụng thiết bị đầu cuối, một tập hợp các tệp trong đó nhiều số có chung tiền tố để tất cả các tiền tố đó được đặt thành tiền tố mới?

Ví dụ:

011.foo.txt -> 001.foo.txt
011.bar.psd -> 001.bar.psd
011.baz.gif -> 001.baz.gif
012.qux.js -> 002.qux.js
012.corge.png -> 002.corge.png
...
020.thud.txt -> 010.thud.txt

Tôi muốn sử dụng lệnh đổi tên nếu có thể:

đổi tên [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -e|-E perlexpr]*|perlexpr [ files ]

Thực sự đánh giá cao sự giúp đỡ của bạn tìm ra điều này, Cảm ơn!

lá cờ hr
Bạn có muốn đơn giản giảm giá trị số của tiền tố xuống 10 trong mỗi trường hợp không?
user10489 avatar
lá cờ in
Mối quan hệ giữa số nguồn và số mục tiêu của bạn không rõ ràng. Một lần gọi lệnh đổi tên sẽ không thể thực hiện một thao tác phức tạp như thế này. Một cách tiếp cận an toàn cho những thứ như thế này là tạo một tệp (sử dụng awk? Perl?) với nhiều lệnh mv và kiểm tra kết quả cũng như chỉnh sửa bất kỳ sự cố nào và chạy tệp.
io4250 avatar
lá cờ ng
@steeldriver đó là một giải pháp thú vị mà tôi chưa từng nghĩ đến. Nhưng lý tưởng nhất là tôi muốn các tệp được đổi tên bắt đầu tại một điểm cụ thể (ví dụ: 001 hoặc 005) mà không cần thực hiện phép toán nếu có thể để tôi có thể sử dụng cùng một giải pháp bất kể số ban đầu trong danh sách tệp hiện tại.
io4250 avatar
lá cờ ng
@ user10489 Xin lỗi, tôi đã mắc lỗi đánh máy trong ví dụ của mình và đã cập nhật nó (010.thud.txt trước đây được đặt tên không chính xác là 003.thud.txt)
Điểm:2
lá cờ hr

Nếu bạn muốn các tệp có cùng tiền tố ban đầu ánh xạ tới cùng một tiền tố trong lược đồ mới không có dựa vào phép trừ, thì bạn có thể làm như vậy bằng cách tạo một hàm băm (mảng kết hợp) của các tiền tố, đánh số các tiền tố đó theo thứ tự, sau đó thực hiện thay thế đổi tên bằng cách tra cứu trong hàm băm. Bán tại.

$ đổi tên -n -E '
  BẮT ĐẦU {
    $n của tôi = 1;
    %pfxs của chúng tôi;
    tìm kiếm $f của tôi (@ARGV) {
      $pfxs{$1} = (tồn tại $pfxs{$1} ? $pfxs{$1} : $n++) nếu $f =~ /^(\d{3})/
    }
  }
  %pfxs của chúng tôi;
  s/^(\d{3})/sprintf "%03d", $pfxs{$1}/e
' [0-9][0-9][0-9].*
đổi tên(011.bar.psd, 001.bar.psd)
đổi tên(011.baz.gif, 001.baz.gif)
đổi tên (011.foo.txt, 001.foo.txt)
đổi tên(012.corge.png, 002.corge.png)
đổi tên(012.qux.js, 002.qux.js)
đổi tên(020.thud.txt, 003.thud.txt)

Vì nó không dựa vào phép trừ, phương pháp này có thể được sử dụng ngay cả khi các tiền tố ban đầu không phải là số.

Điều này chắc chắn có thể được cải thiện - đặc biệt, người ta có thể kiểm tra giá trị tối đa của $n ở cuối ánh xạ và chọn độ rộng của đầu ra cho phù hợp.

io4250 avatar
lá cờ ng
Xin lỗi @steeldriver Tôi đã gõ nhầm 003.thud.txt, thực ra tôi định gõ 010.thud.txt
lá cờ hr
@ io4250 tbh Tôi cho rằng điều đó không thực sự quan trọng vì chúng ta không có các phần `...` của chuỗi
Điểm:2
lá cờ cn

sử dụng perl đổi tên như yêu cầu.

Đối với những gì câu hỏi của bạn thể hiện:

đổi tên -n 's/^(\d+)/sprintf "%03d", $1-10/e' *

sản lượng chạy khô:

đổi tên(011.bar.psd, 001.bar.psd)
đổi tên(011.baz.gif, 001.baz.gif)
đổi tên (011.foo.txt, 001.foo.txt)
đổi tên(012.corge.png, 002.corge.png)
đổi tên(012.qux.js, 002.qux.js)
đổi tên(020.thud.txt, 010.thud.txt)

Đối với những gì tiêu đề câu hỏi nói, với các tiền tố tuần tự thực tế:

rename -n -E 'use vars q{$n}' -e 's/^(\d+)/sprintf "%03d", ++$n/e' *
đổi tên(011.bar.psd, 001.bar.psd)
đổi tên(011.baz.gif, 002.baz.gif)
đổi tên (011.foo.txt, 003.foo.txt)
đổi tên(012.corge.png, 004.corge.png)
đổi tên(012.qux.js, 005.qux.js)
đổi tên(020.thud.txt, 006.thud.txt)

Đối với cái đầu tiên, nếu bạn không muốn mã hóa cứng đồng bằng 10:

đổi tên -n -E 'sử dụng vars q{$delta}' -e '
    s{^(\d+)}{
        $delta = $1 - 1 trừ khi được xác định $delta;
        sprintf "%03d", $1 - $delta
    }e
' *
Điểm:1
lá cờ jp

trong bash

Hãy thử điều này (chạy khô) từ trong thư mục chứa các tệp:

cho f trong *
làm
    r="${f#*.}"
    p="${f%.*}"
    nếu [ "$p" -eq "$p" ] 2>/dev/null
    sau đó  
    p="$((10#$p - 10))"
    p="$(printf "%03d" $p)"
    echo mv -- "$f" "$p.$r"
    fi 
xong

Nếu bạn hài lòng với bản in ra, hãy thay đổi dòng:

echo mv -- "$f" "$p.$r"

đến:

mv -- "$f" "$p.$r"

loại bỏ tiếng vang để thực hiện đổi tên thực tế.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.