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 globstar
trong 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 find
lệ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 find
nhanh hơn nếu bạn có nhiều tệp vì nó không cần phải gọi một mv
quy 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ì find
chỉ có thể đặt tên tệp ở cuối dòng lệnh và mv
cầ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-directory
và "$@"
là các đối số tiếp theo đến từ find
mở rộng của {}
).