Đổi tên tập tin trong linux bằng regex


9

Tôi đã có một nhóm các tệp mà tôi muốn đổi tên liên tục, các tệp được đặt tên như

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

Và tôi muốn chúng như chữ thường, yyyymmdd, .log

"system.20090101.log"
"something.20090101.log"

Câu trả lời:


14

Tôi đã từng viết các kịch bản perl để làm điều này, cho đến khi tôi phát hiện ra lệnh đổi tên.

Nó chấp nhận một regex perl để thực hiện đổi tên:

Đối với điều này, tôi chỉ cần gõ hai lệnh:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

Tuy nhiên, đối với một số bản phát hành, renamekhông có chức năng này (xem trang hướng dẫn của nó) và bạn có thể phải cài đặt perl-renamehoặc prename.


câu trả lời rất hay
Judioo

8
Coi chừng, một số distro gửi một lệnh đổi tên vô giá trị. Kiểm tra xem bản phân phối của bạn có cái nào trước.
derobert

Tôi biết mmvnhưng cuối cùng nhờ renametôi có thể sử dụng sức mạnh của regex
Ludovic Kuty

5
Trên Arch Linux, đây là perl-rename.
Oleh Prypin

6

Vì tôi không có lệnh đổi tên, tôi dựa vào điều này:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done

5

mmv là một tiện ích linux tiêu chuẩn để di chuyển / đổi tên nhiều tệp. Nó có sẵn từ các repos cho hầu hết các bản phân phối. Ví dụ của bạn ở trên, bạn có thể làm:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

Để biết thêm thông tin, hãy đọc bài viết này hoặc trang người đàn ông .


5

renamesử dụng không phải là rất "tiêu chuẩn". Mỗi tàu distro với một renamecông cụ khác nhau . Chẳng hạn, ở đây trên Gentoo, renamelà từ sys-apps/util-linuxgói và không hỗ trợ regex.

Hamish Downer đề xuất mmv, nó có vẻ hữu ích, đặc biệt để sử dụng bên trong các tập lệnh.

Mặt khác, đối với trường hợp chung, bạn có thể muốn đổi tên . Nó có qmvqcpcác lệnh, sẽ mở trình soạn thảo văn bản bạn chọn (tùy chọn của tôi: Vim) và cho phép bạn chỉnh sửa tên tệp đích ở đó. Sau khi lưu và đóng trình chỉnh sửa, qmv/ qcpsẽ thực hiện tất cả việc đổi tên.

Cả hai mmvqmvcó đủ thông minh để đổi tên file theo đúng thứ tự và cũng để phát hiện đặt lại tên hình tròn, và sẽ tự động tạo ra một tập tin tạm thời nếu cần thiết.


Trên Gentoo, bạn cũng có thể xuất hiện sys-apps/renamegói, cung cấp cho bạn renamexmsẽ đổi tên regex cũng như chữ hoa / chữ thường và những thứ hay ho khác.
radicand

1

Để có sự công bằng:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

đưa ra kết quả này:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Nhưng:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

cho đầu ra đúng:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

thay thế công tắc {-n} bằng {-v}


1

Tôi đã tạo một tập lệnh bash nhỏ để làm điều này:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done

Trong lsđầu ra phân tích cú pháp chung không phải là ý tưởng tốt nhất. Một tìm kiếm ngẫu nhiên đã kéo lên bài đọc dài này trên Unix. SE cho giải trí của bạn. | Ngoài ra, câu trả lời của bạn sẽ phù hợp hơn với câu hỏi vớitr '[:upper:]' '[:lower:]'
HBruijn
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.