Xóa tiền tố khỏi tên tệp


10

Tôi có một loạt các tập tin như sau:

04602635_b0294.DAT20120807164534
04602637_b0297.DAT20120807164713
04602638_b0296.DAT20120807164637
04602639_b0299.DAT20120807164819
04602640_b0298.DAT20120807164748
04602641_b0300.DAT20120807164849
04602650_b0301.DAT20120807164921
04602652_b0302.DAT20120807164956

Tôi cần đổi tên chúng để loại trừ tiền tố. Nó cần phải trông như thế này ..

b0294.DAT20120807164534
b0297.DAT20120807164713
b0296.DAT20120807164637
b0299.DAT20120807164819
b0298.DAT20120807164748
b0300.DAT20120807164849
b0301.DAT20120807164921
b0302.DAT20120807164956

BIÊN TẬP

Tôi quên thêm rằng tôi đang sử dụng Solaris.

Câu trả lời:


19
for file in * ; do
    echo mv -v "$file" "${file#*_}"
done

chạy cái này để thỏa mãn rằng mọi thứ đều ổn
nếu có, hãy xóa echokhỏi lệnh và nó sẽ đổi tên các tệp theo ý muốn.

"${file#*_}"

là một tính năng thay thế thông thường trong vỏ. Nó loại bỏ tất cả các ký tự trước _biểu tượng đầu tiên (bao gồm cả chính biểu tượng). Để biết thêm chi tiết xem tại đây .


Bạn có thể vui lòng giải thích chính xác những gì đang xảy ra trong "${file#*_}"?
Pieter van Niekerk

Tôi thêm lời giải thích cho câu trả lời của tôi.
vội vàng

IMO, hầu hết tất cả các tập lệnh nên được viết để lặp lại đầu ra lệnh mong muốn. Nhưng sau đó không loại bỏ echo, chỉ cần đưa đầu ra tập lệnh vào bash.
Jim L.

7

Bạn có thể sử dụng công cụ renamenày:

rename "s/.*_//" *

Nếu bạn nối -nnó sẽ không đổi tên bất cứ thứ gì và chỉ cho bạn thấy những gì sẽ được thực hiện mà không có -n.

Đáp lại bình luận của rush: tôi renamethực sự là một liên kết prenameđược gửi kèm với gói của Debian và Ubuntu perl.


5
Lưu ý rằng renamekhông phải lúc nào cũng giống nhau trên các hệ thống khác nhau và đôi khi cú pháp của nó có thể khác nhau.
vội vàng

1
Người hỏi hiện đã nói thêm rằng anh ta đang sử dụng Solaris. Vì vậy, lệnh đổi tên này (dành riêng cho Debian và các dẫn xuất) không có sẵn cho anh ta.
Gilles 'SO- ngừng trở nên xấu xa'

1
... Trừ khi anh ta quản lý để xây dựng nó từ nguồn.
sendmoreinfo

@Gilles hoàn toàn perl-renamekhông dành riêng cho Debian. Nó chỉ không được gọi renamenhưng perl-renamehoặc prenametrong các bản phân phối khác. Nó phải luôn luôn ở trong repos và một cái cũng được cài đặt với perl .
terdon

@terdon Lệnh đổi tên các tệp có cách sử dụng cơ bản là biểu thức perl không dành riêng cho Debian. Một lệnh như vậy, được gọi renamevà có khả năng được cài đặt mà không yêu cầu rõ ràng một gói không được gọi là chỉrename dành riêng cho Debian. Các bản phân phối Linux khác gọi lệnh prenamehoặc perl-renameđể tránh nhầm lẫn với linux-linux renamevà không gói nó với gói perl và tôi không biết bất kỳ bản unix nào của Linux gửi nó dưới tên renamehoặc gửi nó trong một cài đặt mặc định dưới bất kỳ tên nào.
Gilles 'SO- ngừng trở nên xấu xa'
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.