2013-06-19 25 views
6

Tôi có rất nhiều tập tin như thế này:file Đổi tên với việc thêm một số vào tên file trong bash

13831_1.jpg 
13838_1.jpg 
138035_1.jpg 
138037_1.jpg 
138039_1.jpg 

tôi cần phải thêm một giá trị của 5000000 đến số lượng các tên tập tin. Kết quả phải như sau:

5013831_1.jpg 
5013838_1.jpg 
5138035_1.jpg 
5138037_1.jpg 
5138039_1.jpg 

Có cách nào để làm điều đó với bash hoặc perl?

Trả lời

7

Làm: rename -v. Nếu nó sẽ xuất:

Usage: rename [-v] [-n] [-f] perlexpr [filenames] 

Kiểm tra này là do có ít nhất hai công cụ đổi tên khác nhau, với các chức năng rất khác nhau. Và giải pháp tôi đang có yêu cầu đổi tên xử lý perlexpr.

Sau đó, bạn có thể:

rename 's/^(\d+)/5000000+$1/e' *.jpg 
+0

tôi muốn thử loại này (như âm thanh rực rỡ), nhưng tôi không có vẻ có 'đổi tên' trong Cygwin. Bạn biết nếu/làm thế nào tôi có thể nhận được nó? –

+2

@SvendHansen, nó thực sự là một [perl script] (http://stackoverflow.org/wiki/Rename.pl). – doubleDown

+0

Tôi đã tìm kiếm trên internet và dường như không có sẵn cho Cygwin. Cài đặt gói 'util-linux' sẽ cung cấp cho bạn lệnh' rename', nhưng nó hoạt động giống 'mv' và dường như không hỗ trợ các biểu thức chính quy (hoặc nếu nó không có định dạng đó). Có một số kịch bản bên thứ ba/nhà viết ra có để cung cấp các chức năng, mặc dù (như thế này: http://nylinuxhelp.com/blogs/command-line/cygwin-rename-command-help) –

4

Một cách để làm điều này chỉ sử dụng bash

for file in *.jpg; do 
    number=${file%_*} 
    therest=${file#$number} 
    mv "$file" "$((number+5000000))$therest" 
done 

Ghi chú:

  • *.jpg sẽ mở rộng tới một danh sách các .jpg tập tin trong thư mục hiện hành (ref: Filename expansion).
  • ${file%_*} xóa mọi thứ sau _ trong tên tệp và gửi lại. (ref: Shell parameter expansion)
  • ${file#$number} xóa nội dung của biến number từ đầu tên tệp và trả lại. (Ref: Shell parameter expansion)
  • $((number+5000000)) đánh giá biểu thức số học trong và trả kết quả (ref: Arithmetic expansion)
-2
$filename  = "13831_1.jpg"; 
$org   = explode("_".$filename); 
$addnumber  = 5000000+$org[0]; 
$string  = implode("_",$addnumber); 
+0

nó thuộc loại ngôn ngữ nào? nó chắc chắn không phải là bash. –

+0

trông giống như [php] (http://php.net/manual/en/function.implode.php) – doubleDown

Các vấn đề liên quan