Đổi tên tập tin với số chẵn


2

Tôi có một bộ sưu tập các hình ảnh được quét các trang sách. Họ tổng cộng khoảng 10.000 trang. Các cuốn sách được in hai bên, với văn bản và bản dịch trên các trang đối diện. Bản dịch đã bị loại bỏ và chỉ có các trang văn bản gốc là các trang được đánh số chẵn.

Tôi cần tên tệp để bao gồm số trang chính xác, trong khi hiện tại chúng nằm trong một chuỗi đơn giản. Hạnh phúc khi sử dụng renamehoặc tương tự.

Để làm cho nó rõ ràng, chúng tôi hiện có đánh số tập tin của mẫu:

1-001.png
1-002.png
1-003.png
 ...

Trong đó số 1 đầu tiên là số khối; Điều này là không thay đổi. Số thứ hai là số trang và điều này cần phải được thay đổi:

1-002.png
1.004.png
1-006.png
 ...

Điều gì sẽ xảy ra nếu tên tệp đầu vào là1-259.png
Avinash Raj

@AvinashRaj Tôi không phải OP nhưng tôi nghĩ điều đó sẽ xảy ra 1-518.png. và 1-260.pngđến 1-520.pngvà vv Trong trường hợp chung, định dạng tên 1-num.pngnày đã được thay đổi thành 1-num*2.png.
2014

1
Nếu bạn làm mv 1-001.png 1-002.pnghơn 1-002.png sẽ bị ghi đè bởi 1-001.png. Bạn nên nhận thức được điều đó. Trên đường vượt qua điều này là bắt đầu với số lượng cao nhất.
phép lạ173

Câu trả lời:


4

Đây là lệnh đổi tên:

rename -n 'our $i=2;s/^(\d+)-(\d+)/sprintf("$1-%04d", $i*$2)/e' *.png

Kết quả:

1-001.png renamed as 1-0002.png
1-002.png renamed as 1-0004.png
1-003.png renamed as 1-0006.png
1-004.png renamed as 1-0008.png
1-005.png renamed as 1-0010.png
...
2-001.png renamed as 2-0002.png
2-002.png renamed as 2-0004.png
2-003.png renamed as 2-0006.png
2-004.png renamed as 2-0008.png
2-005.png renamed as 2-0010.png
-n, --no-hành động 
            Không có hành động: hiển thị những tập tin nào đã được đổi tên.

Với our $itôi đã xác định một biến toàn cục perl và tôi đặt giá trị của nó với 2.

(\d+)-(\d+): (\d+)phù hợp với phần đầu của tên tệp với một hoặc nhiều số chữ số và đặt tên đó là chụp nhóm và một -; sau đó một lần nữa với (\d+)khớp bất kỳ số nào sau dấu gạch ngang ( -) trong tên tệp và đặt nó dưới dạng chụp nhóm.

^khi bắt đầu, ^(\d+)-(\d+)hãy đảm bảo tránh / bỏ qua các tên đổi tên nếu chúng không bắt đầu ( ^) với các số như a11.001.pngvà đổi tên các tệp chỉ khi chúng bắt đầu bằng digit-digit.png.

sprintf("$1-%04d", $i*$2): Chụp nhóm in đầu tiên bằng chỉ mục $1(hoặc tham chiếu ngược của nó) (tham khảo đầu tiên (\d+)trong ^(\d+)-(\d+)) sau đó in giá trị tính toán mới của nhóm $2với chiều rộng tối đa 4 trường ( %4d) và điền vào các trường trống bằng 0s ( %04d).

Lưu ý: Tại sao tôi sử dụng %04dtrong sprintflệnh, bởi vì khi bạn muốn đổi tên 1-001.pngđể 1-002.png, tập tin 1-002.pngđã tồn tại và bạn không thể đổi tên nó. Vì vậy, tôi đã thêm một số 0 vào trước trường thứ hai để tránh lỗi này.


Hoặc như @muru gợi ý, bạn có thể sử dụng tham chiếu ngược thay vì biến toàn cục

rename -n 's/^(\d+)-(\d+)/sprintf("$1-%04d",$2*2)/e' *.png

$1là tham chiếu ngược của thứ nhất (\d+)$2là tham chiếu ngược của thứ hai (\d+). Lưu ý rằng bạn phải sử dụng cặp dấu ngoặc đơn (group)để đặt nó dưới dạng chụp nhóm.

Cuối cùng, bạn có thể xóa -ntùy chọn khỏi lệnh để đổi tên trên các tệp của mình.


Gợi ý: Thay vì điều biến toàn cục, hãy sử dụng phản hồi:rename -n 's/^1-(\d+)/sprintf("1-%04d",$1*2)/e'
muru

Phiên bản được sửa đổi bởi muru đã làm điều đó. Với kịch bản gốc của KasiyA, việc đánh số tiếp tục tăng thậm chí trên nhiều tập, không khởi động lại việc đánh số trang với mỗi tập như bình thường. Ví dụ. nếu tôi có 1-001.png, 1-002.png, ... 1-100.png, 2-001.png, 2-002.png, v.v., kịch bản gốc của @ Kasiya tạo ra: 1-002. png, 1-004.png, ... 1-200.png, 2-202.png, 2-204.png, v.v ... Phiên bản được sửa đổi sau muru cho tôi 1-002.png, 1-004.png , ... 1-200.png, 2-002.png, 2-004.png, đó là những gì tôi đang theo đuổi.
dùng2360490

@ user2360490 Cập nhật câu trả lời. Tôi mặc dù tất cả các tập tin của bạn bắt đầu với 1-....png. Bây giờ cố định như những gì bạn muốn.
αsнι

0

Làm việc theo giả định rằng bạn muốn nhân mỗi số trang với 2,

#!/bin/sh

tmpext=tmpext # temporary extension to avoid clobbering existing files

# double the page number and change .png to tmpext
for page in ./*-[[:digit:]][[:digit:]][[:digit:]].png; do
  vol=${page%-*}
  num=${page#$vol-}
  num=${num%.png}
  zeroes=${num%%[!0]*}
  num=${num#$zeroes}
  tmppage=${vol}-$(printf %.3d $((num * 2))).$tmpext
  mv -vi "$page" "$tmppage"
done

# move .tmpext back to .png
for tmppage in ./*."$tmpext"; do
  mv -vi "${tmppage}" "${tmppage%$tmpext}png"
done

Bạn dải tên tập tin cuối cùng để 1-.png.
năm14

@KasiyA Tôi không chắc ý của bạn là gì. Tên tập tin gì?
jw013

Làm touch 1-{001..008}.pngvà chạy kịch bản của bạn. Như bạn thấy một trong những tên tệp (tôi nghĩ đó là tệp cuối cùng) đổi tên thành 1-.png.
năm14

@KasiyA Tôi thấy, các số 0 đứng đầu đã được hiểu là số bát phân. Tước ra các số 0 hàng đầu dường như là cách dễ nhất để khắc phục vấn đề đó.
jw013
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.