Sau đây là cách khắc phục trực tiếp phương pháp của bạn:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
Tuy nhiên, điều này rất tốn kém nếu bạn có nhiều tệp phù hợp, bởi vì bạn bắt đầu một lớp vỏ mới (thực thi a mv
) cho mỗi trận đấu. Và nếu bạn có các ký tự vui nhộn trong bất kỳ tên tệp nào, nó sẽ phát nổ. Một cách tiếp cận hiệu quả và an toàn hơn là:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Nó cũng có lợi ích khi làm việc với các tệp có tên lạ. Nếu find
hỗ trợ nó, điều này có thể được giảm xuống
find . -type f -name 'file*' -exec mv {} {}_renamed \;
Các xargs
phiên bản rất hữu ích khi không sử dụng {}
, như trong
find .... -print0 | xargs --null rm
Ở đây rm
được gọi một lần (hoặc với nhiều tệp nhiều lần), nhưng không phải cho mọi tệp.
Tôi đã xóa basename
câu hỏi trong bạn, bởi vì nó có thể sai: bạn sẽ chuyển foo/bar/file8
đến file8_renamed
, không foo/bar/file8_renamed
.
Chỉnh sửa (như được đề xuất trong ý kiến):
- Đã thêm rút ngắn
find
mà không cầnxargs
- Đã thêm nhãn dán bảo mật
x
là vô dụng:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
phiên bản có hiệu quả tương tự như ví dụ đầu tiên /