Sao chép / đổi tên nhiều tệp bằng biểu thức chính quy (shell script)


8

Tôi có một tập hợp các tệp khớp với một mẫu như 'gán02.cc', 'gán02.h', 'gán02.txt', v.v. Tôi muốn sao chép / đổi tên các tệp này thành 'gán03.cc', 'gán03. h ',' gán03.txt ', v.v.

Tôi nghi ngờ điều này nên được sử dụng một kịch bản shell và sed. Cho đến nay tôi có:

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

Thật không may, cách tôi gọi sed luôn trả về chuỗi đầu vào $namevà không thực sự thực hiện việc tìm / thay thế regex.

Lưu ý: Nhìn trên internet có một renamelệnh có chức năng này, nhưng không có trên MacBook của tôi.


Thay đổi dấu ngoặc đơn thành dấu ngoặc kép. Nếu bạn có dấu nháy đơn xung quanh lệnh sed, sau đó $OLD_NO$NEW_NOsẽ không được mở rộng.
Mikel

newname=$(echo $name | tr $OLD_NO $NEW_NO)
Nizam Mohamed

Câu trả lời:


5

Sử dụng sed ở đây giới thiệu sự phức tạp hơn giá trị của nó. Sử dụng các tính năng thao tác văn bản tích hợp của shell. Ví dụ: ${name#assignment02}tước tiền tố assignment02từ $name.

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

Dấu ngoặc kép là không cần thiết nếu bạn chắc chắn rằng tên tệp không chứa ký tự đặc biệt shell.

Nếu bạn có sẵn zsh, zmvchức năng của nó rất hữu ích cho các loại đổi mới này.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'

3

Bạn đã suy nghĩ quá phức tạp

rename 02 03 *02*

'Đổi tên' thay thế đối số thứ nhất ('02') bằng đối số thứ hai ('03') trong tên của tất cả các tệp được cung cấp trên arg3 hoặc sau (* 02 *)


Các renamelệnh với cú pháp này là một tiện ích Linux, không có sẵn trên OSX (và thậm chí không có tên này trên hầu hết các bản cài đặt Debian và Ubuntu).
Gilles 'SO- ngừng trở nên xấu xa'

À, không biết bạn đã ở trên osx, bummer
Patrick

Đổi tên là tập lệnh perl, vì vậy nó có thể sẽ chạy trên OS X. Tìm thấy nó ở đây bằng cách sử dụng google: tips.webdesign10.com/files/rename.pl.txt
azzid 7/215

0

Một cách tiếp cận khác:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

Về lâu dài: Cố gắng để có được 'đổi tên'


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.