Đổi tên tất cả các tệp trong thư mục từ $ filename_h thành $ filename_half?


139

Chết một cách đơn giản.

Làm thế nào để tôi đổi tên

05_h.png
06_h.png

đến

05_half.png
06_half.png

Ít nhất, tôi nghĩ nó đơn giản, nhưng thật khó để Google cho loại điều này trừ khi bạn đã biết.

Cảm ơn....

Câu trả lời:


301

Chỉ cần sử dụng bash, không cần phải gọi các lệnh bên ngoài.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

Đừng thêm vào #!/bin/sh

Đối với những người cần một lót:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done

7
Việc sử dụng tốt thay thế chuỗi tích hợp của bash thay vì sed
diễn ra vào

3
là tập tin / _h.png / _half.png regex?
dùng2799603

15
Không, định dạng là: $ {chuỗi / chuỗi con / thay thế} - "lần xuất hiện đầu tiên". Để biết thêm thông tin, hãy kiểm tra bảng cheat này (phần "chuỗi"): bruxy.regnet.cz/linux/bash_chcoateet / bash_chcoateet.pdf
WindRider

11
Bất kỳ lý do cho Do not add #!/bin/sh? Tôi đã thử cả làm việc với / không có tuyên bố này.
Ryan

6
@Ryan @Ishan Jain Trong thực tế, nó chỉ ra trình bao phụ trợ phải thực thi tập lệnh. sh và bash là các shell khác nhau nên có thể ảnh hưởng đến hành vi và cú pháp của tập lệnh. Vì tập lệnh sử dụng thay thế chuỗi tích hợp bash, bạn nên thêm tiêu đề #!/bin/bash. Điều này nói rằng, bash thường là vỏ mặc định trong nhiều máy tính nên bạn sẽ không tìm thấy nhiều điểm khác biệt: D Bạn có thể tìm thêm thông tin ở đây
Cristian Ramon-Cortes

65

Hãy thử renamelệnh:

rename 's/_h.png/_half.png/' *.png

Cập nhật:

sử dụng ví dụ:

tạo một số nội dung

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

giải pháp kiểm tra:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou: Tôi đã thêm phiên kiểm tra ví dụ. Hãy thử nó. Bạn có thể có một số lỗi đánh máy. Đầu ra của là lsgì? là những gì rename ...bạn cố gắng?
Michał rajer

2
Không hoạt động trong bash trên Mac, fwiw. renamekhông phải là một công cụ Unix tiêu chuẩn.
tandrewnichols

1
@tandrewnichols, hãy thử homebrew - sau khi cài đặt, đổi tên sẽ khả dụng sau vài giây vớibrew install rename
Simbamangu

4
đối với tôi, việc đổi tên không hoạt động với 's//'- Tôi đã giới thiệu người đàn ông và có bản tóm tắt đơn giản : rename [options] expression replacement file..., trên CentOS 7, phiên bản:rename from util-linux 2.23.2
tymik

2
Hãy nhớ rằng .phù hợp với BẤT K character ký tự nào, không chỉ là một dấu chấm - đối với dấu chấm theo nghĩa đen, \.thay vào đó hãy sử dụng
Meisner

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
Điều này là tuyệt vời để làm một chạy khô trước. Lần đầu tiên tôi thay thế mv $f $fnewbằng echo $fnewdòng thứ hai để đảm bảo đầu ra trông có vẻ lành mạnh.
lobati

10

Bạn đang tìm kiếm một giải pháp bash tinh khiết? Có nhiều cách tiếp cận, nhưng đây là một.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Điều này giả định rằng các tệp duy nhất trong thư mục hiện tại kết thúc _h.pnglà những tệp bạn muốn đổi tên.

Cụ thể hơn nhiều

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

Giả sử hai ví dụ này là duy nhất của bạn. các tập tin.

Đối với trường hợp chung, việc đổi tên tập tin đã được đề cập trước đó .


6

Sử dụng các renametiện ích được viết bằng perl. Có thể mặc định nó không có sẵn mặc dù ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png

4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done

4

Tôi đã có một câu hỏi tương tự: Trong hướng dẫn, nó mô tả đổi tên thành

rename [option] expression replacement file

vì vậy bạn có thể sử dụng nó theo cách này

rename _h _half *.png

Trong mã: '_h' là biểu thức mà bạn đang tìm kiếm. '_Half' là mẫu mà bạn muốn thay thế. '* .png' là phạm vi tệp mà bạn đang tìm kiếm tệp mục tiêu có thể của mình.

Hy vọng điều này có thể giúp c:


1

Một cách tiếp cận khác có thể được sử dụng thủ công tùy chọn đổi tên hàng loạt

Nhấp chuột phải vào tệp -> Lệnh tùy chỉnh tệp -> Đổi tên hàng loạt và bạn có thể thay thế h. với một nửa.

Điều này sẽ làm việc cho gui dựa trên linux bằng WinSCP, v.v.


0

Sử dụng renametiện ích:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png

0

Lót:
for file in *.php ; do mv "$file" "_$file" ; done


0

Mặc dù bộ câu trả lời đã hoàn tất, tôi cần thêm một câu hỏi còn thiếu.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
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.