Nếu bạn muốn di chuyển tất cả các tệp trong hệ thống phân cấp thư mục sang một thư mục đích duy nhất, trong bash 4 (đặt shopt -s globstartrong của bạn ~/.bashrc) hoặc zsh:
mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory
Trong các vỏ khác:
mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;
Cách đọc findlệnh này :
.: duyệt qua thư mục hiện tại
-name '*.xxx': hành động trên các tệp có tên khớp với mẫu này
-exec … \;: thực hiện lệnh này trên mỗi tệp, thay thế {}bằng đường dẫn đến tệp
Có một lệnh phức tạp hơn bằng cách sử dụng findnhanh hơn nếu bạn có nhiều tệp vì nó không cần phải gọi một mvquy trình riêng cho mỗi tệp:
find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +
Các +cuối cùng nói findđể gọi lệnh trên nhiều file cùng một lúc. Vì findchỉ có thể đặt tên tệp ở cuối dòng lệnh và mvcần có thư mục đích cuối cùng, chúng tôi sử dụng trình bao trung gian để sắp xếp lại các đối số ( "$0"là đối số đầu tiên cho trình bao ~/new-directoryvà "$@"là các đối số tiếp theo đến từ findmở rộng của {}).