Đổi tên tệp bằng cách tăng một số trong tên tệp


14

Tôi có một thư mục chứa các tệp hình ảnh được đánh số, đại loại như thế này:

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

Đôi khi có thể có nhiều phiên bản của một tệp ở các định dạng khác nhau (ví dụ: a pngsvgphiên bản của 0309các tệp ở trên) nhưng các số khác nhau liên tiếp. Thông thường có 40-80 tệp như vậy trong mỗi thư mục. Các số tương ứng với thứ tự những hình ảnh này xuất hiện trong bản thảo (tài liệu Word, nhưng điều đó không quan trọng). Không có cách nào khác để xác định thứ tự của hình ảnh.

Nếu tôi thêm một hình ảnh mới vào bản thảo, tôi cần đặt một bản sao của hình ảnh trong thư mục này với cách đánh số chính xác. Vì vậy, nếu hình ảnh mới là thứ năm trong bản thảo, tôi cần đổi tên các tệp trong thư mục này để tạo chỗ cho nó:

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

Cách đơn giản nhất từ ​​dòng lệnh, hoặc từ tập lệnh hoặc macro để đánh số lại tất cả các tệp bắt đầu từ một số nhất định là gì? Tôi có một bản cài đặt Fedora Linux tiêu chuẩn bằng cách sử dụng bash.

Câu trả lời:


11

Tôi nghĩ rằng nó nên làm công việc:

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done

Script lấy một tham số - số lượng hình ảnh mới của bạn.

Tái bút Đặt tập lệnh trong thư mục khác hơn hình ảnh của bạn. Trong thư mục hình ảnh chỉ nên có hình ảnh được đặt tên theo cách này mà bạn đã mô tả.


Điều này có vẻ đầy hứa hẹn, tôi sẽ thử nó sau vài giờ khi tôi quay lại máy tính xách tay của mình.
robertc

Điều này sẽ chỉ hoạt động nếu tên tệp của bạn không được thêm tiền tố bởi các ký tự không phải là số
mems

@mems OP nói rõ rằng tên tệp bắt đầu bằng một số
xhienne

2

Điều này sẽ dễ dàng hơn trong zsh, nơi bạn có thể sử dụng

  • các On glob vòng loại đến trận đấu sắp xếp trong thứ tự giảm dần (và nsử dụng số thứ tự, trong trường hợp tên file không tất cả đều có zero để cùng một chiều rộng hàng đầu);
  • các (l:WIDTH::FILLER:) lá cờ mở rộng tham số để pad tất cả các số để cùng một chiều rộng (chiều rộng của số lớn hơn).
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done

Trong bash, đây là tập lệnh giả định các tệp được đệm theo chiều rộng cố định (nếu không, tập lệnh sẽ không đổi tên đúng tệp) và tập tin thành chiều rộng cố định (phải được chỉ định).

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done

1

Vấn đề chính xác này được đề cập trong bài viết này . Lưu ý rằng bạn sẽ phải sửa đổi nó để hỗ trợ các định dạng SVG và PNG, bằng cách thêm bước MV thứ hai.


Tôi không nghĩ đó là vấn đề chính xác, điều đó sẽ đánh số lại tất cả các hình ảnh mỗi lần. Tôi chỉ muốn đánh số lại các hình ảnh từ một điểm cụ thể.
robertc

1

Dễ dàng hơn:

touch file`ls file* | wc -l`.ext

Bạn sẽ nhận được:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext

Làm cách nào để thêm số 0 đứng đầu cho 1-9? Cũng cần nhớ có thể có hai tệp 03.png và 03.svg.
robertc

1

Dường như không có nhiều sự quan tâm gần đây cho câu hỏi này, nhưng nếu ai đó vấp phải nó, có ba vấn đề ở đây. Một là làm thế nào để chọn các tệp để đổi tên dựa trên các tiêu chí ngữ nghĩa (phạm vi không phải là từ vựng và không thể được chỉ định bởi các ký tự đại diện hoặc thậm chí các biểu thức thông thường-- lý thuyết automata nói rằng điều này phức tạp hơn NFA). Thứ hai là làm thế nào để thay đổi tên bằng cách sửa đổi một phần của tên đó. Thứ ba là làm thế nào để tránh va chạm tên. Một tập lệnh trong Bash và nhiều ngôn ngữ khác có thể thực hiện chuyển đổi cụ thể này, nhưng hầu hết chúng ta không muốn phải viết một chương trình mỗi khi chúng ta muốn đổi tên một loạt các tệp. Với rene.py (miễn phí và nguồn mở) của tôi, bạn có thể làm những gì bạn muốn nhưng phải mất hai lần để tránh sự cố xung đột tên. Đầu tiênrene ?.*/#7-80 %?.* Btăng tất cả các tên trong phạm vi, thêm tiền tố% để tránh các tên hiện có. Sau đó rene %* *loại bỏ tiền tố này khỏi các tệp có nó. Tôi mô tả điều này tại https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

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.