2009-12-02 8 views
5

tôi có rất nhiều các tập tin Tôi đang cố gắng để đổi tên, tôi đã cố gắng để tạo ra một biểu hiện thường xuyên để phù hợp với họ, nhưng ngay cả rằng tôi đã bị mắc kẹt trên các tập tin được đặt tên như:Tôi có thể dễ dàng đổi tên hàng loạt tệp bằng Perl như thế nào?

File Name 01

file Name 100

file Name 02

file Name 03

vv, tôi muốn một dd "0" (zero), đằng sau bất kỳ tập tin đó là nhỏ hơn 100, như thế này:

File Name 001

File Name 100

File Name 002

file Tên 003

Gần nhất tôi đã kết hợp với họ bằng cách sử dụng kiểu tìm kiếm này d | sắp xếp -r | grep '[1-9] [0-9] $' tuy nhiên tôi không thể tìm ra cách thay thế chúng. Cảm ơn trước vì bất kỳ trợ giúp nào bạn có thể cung cấp cho tôi. Im trên CentOS nếu đó là của bất kỳ sự giúp đỡ, tất cả điều này đang được thực hiện thông qua SSH.

+0

Đừng tên tập tin của bạn thực sự chứa khoảng trắng? –

+0

Có, chúng trông giống như: "Tên tệp 01" "Tên tệp 101" –

+1

Bạn có thể xây dựng trên "công cụ" có sẵn trên máy không? Bạn có perl, python, ruby ​​hoặc cài đặt tương tự? –

Trả lời

12
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}' 

Một chút quá mức có thể, nhưng nó là những gì được hỏi.

0

Tôi nghĩ mmv là bạn của bạn ở đây.

9
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

hoặc một cái gì đó như thế, với điều kiện

  1. Bạn đã GNU tìm và GNU xargs (đối với -print0-0)
  2. Bạn đã là 'đổi tên' tiện ích mà đi kèm với perl
  3. Có chỉ một nhóm chữ số trong tên tệp. Nếu có nhiều hơn một, sau đó bạn cần phải làm một cái gì đó với regex để làm cho nó chỉ phù hợp với số bạn muốn định dạng lại.
+0

Đó là gần với một cái gì đó tôi sẽ đề nghị, sử dụng sed thay vì xargs, vì vậy tôi sẽ +1 nó. – shoover

+0

Tôi biết xargs là con đường để đi, tôi chỉ không thể viết lệnh chính xác. –

+0

+1 Đối với phụ thuộc danh sách (có thể là tiện ích đổi tên bạn đang đề cập đến là một yum hoặc apt-get away). – ChristopheD

2

Run hai lệnh, theo thứ tự này:

$ rename 's/File Name (\d)$/File Name 0$1/' * 
$ rename 's/File Name (\d\d)$/File Name 0$1/' * 

Đầu tiên đổi tên tất cả mọi thứ dưới 10 và prepends một số không. Cái thứ hai đổi tên tất cả mọi thứ nhỏ hơn 100 và thêm một số không. Kết quả phải là ba chữ số cho tất cả tên tệp.

+0

Trong những môi trường nào là những lệnh hợp lệ? –

+0

'đổi tên' là một tiện ích đi kèm với phân phối chuẩn perl. Tôi chạy chúng dưới Linux Bash. –

+0

[$ $ nghĩa vụ phải đại diện cho một dấu nhắc lệnh.] –

0

bạn có thể làm điều gì đó bằng cách sử dụng perl hoặc ruby.

đặt tất cả các file này trong cùng một thư mục

dirlisting = DIR.entries('.') 

dirListing.each do |file| 
num = file.match(/\d+$/).to_i 
if num < 100 
    find the position where start the number, with index and inject the 0 there. 
end 
end 
+0

Bạn có lẽ nên đề cập rằng mã này là ruby ​​và không perl –

+0

nếu bạn đọc câu của tôi bạn sẽ thấy "perl OR ruby" –

+0

Và đó là lý do tại sao tôi nói bạn nên phân biệt thực tế là mã là ruby. –

4

Đây có phải là một điều một lần? Nếu có, tôi sẽ đề xuất một thứ có vẻ như là một cảnh sát của nhiều lập trình viên tại đây:

Đường dẫn đầu ra của lệnh (find -type d | sort -r | grep ' [1-9][0-9]$') vào một tệp và sử dụng một số tìm kiếm/thay thế toàn cầu ma thuật để tạo ra một kịch bản mà không đổi tên.

Sau đó vứt bỏ tập lệnh.

Có chút ít phiền toái và ít có khả năng bạn sẽ tự bắn mình bằng chân bằng cách thử một lần một lớp lót thông minh (nhưng không được sửa lỗi) đi vào cỏ dại trên tệp của bạn.

+0

++! Đôi khi tốt hơn là sử dụng một kludge bạn hiểu hơn là học "ma thuật sâu sắc". – daotoad

+0

+1 Tôi nghĩ rằng loại điều này thường là giải pháp thực dụng nhất cho một yêu cầu off –

+0

Nó có thể là một cảnh sát, nhưng đó là một cảnh sát an toàn ... kudo. –

0
use strict; 
use File::Copy; 

my @files = glob 'File*Name*'; 

foreach my $filename (@files) { 
    if ($filename =~ m`^.*File.*Name.*?(\d+)`) { 
     my $number = $1; 
     next if ($number > 99); 
     rename $filename, sprintf("FileName%03d",$number); 
    } 
} 
+0

Đổi tên 'Tên tệp 100' thành 'Tên tệp 0100' không được dự định. –

+0

Bạn chắc chắn là đúng. Thêm một số mã để làm cho nó như vậy sẽ không xảy ra. –

1

Trong debian, nó hoạt động tốt với đổi tên, thử nghiệm với 300 tệp.

perl -e 'map `touch door$_.txt`, 1..300;' 
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt 
0

nếu từ xa của bạn có vỏ bash

for i in File*; 
do 
    case "${i##* }" in [0-9][0-9]) 
     echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
    esac; 
done 

remove "echo" để làm đổi tên thực tế