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 findhỗ trợ nó, điều này có thể được giảm xuống
find . -type f -name 'file*' -exec mv {} {}_renamed \;
Các xargsphiê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 basenamecâ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
findmà không cầnxargs
- Đã thêm nhãn dán bảo mật
xlà vô dụng:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsphiên bản có hiệu quả tương tự như ví dụ đầu tiên /