Sử dụng prename
(bí danh cho rename
nhiều hệ thống) có thể thực hiện việc này mà không cần chạy nhiều lần mv
hoặc cp
:
cd /home/user
find . -type f -name 'Loads.bdf' -exec \
prename -n 's:^./::; s:/:_:g; s:^:destination/:' {} +
Xóa -n
khi bạn chắc chắn điều này đang di chuyển các tệp bạn muốn.
Cập nhật
Để sao chép các tệp thay vì di chuyển chúng, cách nhanh nhất là sao chép trước bằng cpio
hoặc pax
sau đó đổi tên như trước. Ví dụ: (với GNU cpio
):
cd /home/user
find . -type f -name 'Loads.bdf | cpio -p --make-directories destination
cd destination
find . -type f -name 'Loads.bdf' -exec prename -n 's:^./::; s:/:_:g' {} +
Lưu ý rằng mặc dù pax
là cả POSIX và LSB và cpio
không còn là POSIX, cpio
nhưng đây vẫn là chương trình thường được tìm thấy ở nhiều hệ thống.
Để xử lý tên tập tin với dòng mới với GNU find
/ cpio
người ta có thể thêm -print0
vào find
và -0
để cpio
.
Cập nhật 2
Các pax
giải pháp là một lớp lót (không bao gồm cd
):
cd /home/user
find . -name 'Loads.bdf' | cut -d/ -f 2- | pax -rws ':/:_:g' destination
Hoặc cho bất kỳ tên tệp (và GNU find
):
find /home/user -name 'Loads.bdf' -printf '%P\0' | pax -0rws ':/:_:g' destination