Thay đổi đệ quy phần mở rộng tệp trong Bash


87

Tôi muốn lặp lại một cách đệ quy qua một thư mục và thay đổi phần mở rộng của tất cả các tệp của một phần mở rộng nhất định, chẳng hạn .t1như .t2. Lệnh bash để làm điều này là gì?


14
IMHO đây không phải là một câu hỏi trùng lặp - các câu hỏi khác không phải là đệ quy
shonky người dùng Linux

Câu trả lời:


207

Nếu bạn có sẵn đổi tên thì hãy sử dụng:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

hoặc cái gì đó khác:

find . -name '*.t1' -exec rename .t1 .t2 {} +

Nếu không có đổi tên thì hãy sử dụng:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +

20
find . -name '*.t1' -exec rename .t1 .t2 {} +
Aaron Blenkush

2
(Phiên bản của renametôi không cho phép biểu thức thay thế kiểu sed. Tôi yêu Linux. Tôi đã từng phải cài đặt TotalCommander cho Windows để làm những thứ như thế này.)
Aaron Blenkush

6
Trong trường hợp có ai đó đang thắc mắc "${1%.t1}".t2phần này làm gì, như tôi đã làm: Nó sử dụng thao tác chuỗi bash để thực hiện như sau: 1 / Lấy tham số vị trí đầu tiên $1và cắt ngắn .t1chuỗi ký tự khỏi phần cuối của nó ( %toán tử dấu phần trăm ). 2 / Nối .t2chuỗi ký tự vào kết quả.
Zack

2
Việc đổi tên không hoạt động đối với tôi trong OSX, nhưng phiên bản bash thật tuyệt vời b / c Tôi vừa thêm 'git' vào trước mv và bây giờ git rất vui :-D
bdombro 21/09/18

3
thích sử dụng find . -type f -name '*.t1'đến các thư mục tránh
Golak Sarangi

8

Nếu phiên bản của bạn bashhỗ trợ globstartùy chọn (phiên bản 4 trở lên):

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 

7

Hoặc bạn có thể chỉ cần cài đặt mmvlệnh và thực hiện:

mmv '*.t1' '#1.t2'

Đây #1là phần hình cầu đầu tiên tức là phần *trong *.t1.

Hoặc trong nội dung bash thuần túy, một cách đơn giản sẽ là:

for f in *.t1; do
    mv "$f" "${i%.t1}.t2"
done

(ví dụ: forcó thể liệt kê các tệp mà không cần sự trợ giúp của lệnh bên ngoài như lshoặc find)

HTH


7
Tôi giả sử việc OP sử dụng "đệ quy" cũng đề cập đến việc đổi tên các tệp trong các thư mục con của thư mục.
chepner

Xin lỗi, nhưng ý nghĩa của số 1 là gì?
inafalcao

1
đó là phần hình cầu đầu tiên tức là *trong*.t1
zmo.

đệ quy: $ mmv -n ';*.t1' '#1#2.t2'. gỡ bỏ -ncờ để thực thi
okliv

5

Tôi sẽ làm theo cách này trong bash:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done

CHỈNH SỬA: sai lầm của tôi: nó không phải là đệ quy, đây là cách của tôi để thay đổi đệ quy tên tệp:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done

8
Đừng phân tích cú pháp ls , và hãy xem cùng một trang để biết lý do tại sao findcú pháp của bạn kém. Ngoài ra, hãy đảm bảo rằng bạn trích dẫn các biến của mình
Phục hồi Monica Xin vui lòng

2
Cảm ơn, tôi không biết.
jrjc
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.