Làm thế nào bạn có thể di chuyển (hoặc sao chép) tất cả các tệp thuộc một loại nhất định vào một thư mục trong Unix?


22

Tôi chưa quen lắm với tất cả các mánh khóe grep/find/awk/xargs.

Tôi có một số tập tin phù hợp với một mẫu cụ thể, nói *.xxx. Những tập tin này ở những nơi ngẫu nhiên trong suốt một thư mục nhất định. Làm cách nào tôi có thể tìm thấy tất cả các tệp như vậy và di chuyển chúng vào một thư mục trong thư mục chính của tôi trên Unix (có thể chưa tồn tại)?


4
Bạn phải cẩn thận khi nói về "loại tệp". Trong các môi trường đơn nhất, ví dụ ".xxx" thậm chí không phải là một phần mở rộng theo nghĩa Windows. ".Xxx" chỉ tạo thành một hậu tố của tên tệp. "Loại tệp" là một trong một vài loại: tệp thông thường, tệp thiết bị, liên kết tượng trưng, ​​thư mục, đường ống có tên, ổ cắm gia đình Unix, có thể một vài loại khác.
Bruce Ediger


@BruceEdiger cảm ơn tôi đoán tôi thực sự có nghĩa là "mẫu tên tệp"
qodeninja

Câu trả lời:


22
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

1
Tôi sẽ sử dụngmv -i -t ~/dst {} +
enzotib

17

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-directory"$@"là các đối số tiếp theo đến từ findmở rộng của {}).


4

Nếu bạn muốn sao chép cấu trúc thư mục của các tệp nguồn phù hợp vào thư mục đích mới, bạn có thể sử dụng tùy chọn --parents của GNU cp :

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

bạn có thể sử dụng mà không cần tìm -exec‍cũng như:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
Lưu ý tuy nhiên đó find -execlà an toàn hơn nhiều; ví dụ ở trên sẽ không thành công với tên tệp chứa khoảng trắng.
dhag
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.