Làm thế nào để di chuyển nhiều tệp cùng một lúc đến một thư mục đích cụ thể?


152

Tôi đã nhận được một loạt các tập tin trong một số thư mục (cùng với nhiều tập tin khác) mà tôi muốn di chuyển.

May mắn thay, tất cả các tệp tôi muốn di chuyển đều chứa một mã định danh nhất định trong tên của chúng, vì vậy tôi có thể ls | grep IDENTIFIERlấy danh sách chính xác các tệp cần di chuyển.

Nhưng, làm thế nào tôi có thể thực thi mv file /path/to/dest/folder/cùng một lúc chứ không phải từng cái một (có rất nhiều tệp để di chuyển)?

Câu trả lời:


100

Nếu bạn muốn di chuyển ABC-IDENTIFIER-XYZ.exthoặc IDENTIFIER-XYZ.xml, bạn có thể sử dụng:

mv *IDENTIFIER* ~/YourPath/

*là ký tự đại diện cho 0 hoặc nhiều ký tự , điều này có nghĩa là 0 hoặc nhiều ký tự , theo sau IDENTIFIER, theo sau là 0 hoặc nhiều ký tự .

Điều này sẽ di chuyển tất cả các tập tin chứa các IDENTIFIERbạn chỉ định.


201

Bạn đã có thể sử dụng

mv -t DESTINATION file1 file2 file3

mv -t DESTINATION `ls|grep IDENTIFIER`

hoạt động, nhưng tôi không chắc liệu mv có được gọi nhiều lần hay không vì grep sẽ tạo ra một dòng mới cho mỗi trận đấu.


5
hoạt động trên linux, không chắc nó có hoạt động trên mac không
Alexander Mills

3
hoạt động trên mac và git bash thông qua git cho gió.
Brandt Solovij

11
Không hoạt động trên Mac (10.11.16 El Capitan). Nhưng bạn có thể chỉ cần đặt thư mục đích ở phía sau, tức làmv file1 file2 ... destination
Sheljohn 23/07/17

2
-1 cho cách tiếp cận thứ hai vì nó sẽ rơi vào các tệp bao gồm các dòng mới
αsнι


24

Bạn có thể sử dụng ký tự đại diện .

Ví dụ: Để di chuyển tất cả các tệp có phần mở rộng .doc

mv *.doc /path/to/dest/folder/

Điều này sẽ di chuyển tất cả các tệp doc trong thư mục hiện tại đến đích cụ thể.

Biên tập

Để trả lời bình luận.

mv *.ext *.xml *.txt /path/to/dest/folder/


2
nhưng danh sách các tập tin cần di chuyển không được xác định bởi phần mở rộng. một số tệp được đặt tên: ABC-IDENTIFIER-XYZ.extvà một số chỉ IDENTIFIER-XYZ.extcó các phần mở rộng khác nhau, chủ yếu là xmlhoặc properties.
gilad hoch

@giladhoch Làm thế nào về một chỉnh sửa?
Achu

@gliadhoch Nếu bạn cảm thấy thoải mái khi sử dụng grep, bạn có thể xem câu trả lời của tôi ở trên / bên dưới.
đốt cháy

sẽ không hoạt động vì có các .xmltệp khác (ví dụ) tôi không muốn di chuyển.
gilad hoch

20

Trong trường hợp bạn muốn di chuyển một tập hợp các tệp không liên quan (không có mẫu chung trong tên và loại), bạn có thể làm như ông Rajanand nói: trước tiên hãy vào thư mục chứa các tệp bạn muốn di chuyển

mv file1.ext1 file2.ext2 file3.ext3.. /destination/

Trong trường hợp các tệp nằm rải rác trong các thư mục khác nhau, bạn chỉ cần chỉ định đường dẫn cho mỗi tệp trong lệnh di chuyển


10

Tôi sử dụng kỹ thuật của tuomaz, nhưng sửa đổi một chút:

mv file1 file2 file3 -t DESTINATION

Tôi thấy điều này dễ nhớ và khó bắt vít hơn vì nó sử dụng thứ tự giống như thao tác vanilla mv:

mv file1 DESTINATION

Trang người đàn ông mvkhông đề cập đến một -ttùy chọn.
Noumenon


7

Sử dụng lệnh này:

mv `ls|grep IDENTIFIER` /path/to/dest/folder  

Tuy nhiên, ls không được khuyến khích cho loại sử dụng này. Sử dụng lệnh find thay thế.


8
lskhông được khuyến khích cho loại sử dụng này. Nếu bạn muốn liệt kê các tập tin, đặc biệt là grepphía sau, hãy sử dụng find . -name \*IDENTIFIER\*.
NorTicUs

Câu trả lời này chỉ để chứng minh làm thế nào bạn có thể sử dụng đầu ra của lệnh trước đó trong mv. Như ls | grep đã được đề cập trong câu hỏi, tôi chỉ sao chép nó.
đốt cháy

3
Như tuyên bố của @NorTicUs, việc sử dụng ls là không nên. Ngoài ra, các tệp có khoảng trắng có thể gây ra sự cố.
Paddy Landau


5

Nếu bạn có quá nhiều tệp để di chuyển, bạn thực sự có thể có quá nhiều cho mvlệnh (hoặc các lệnh khác như rm). Tôi đề nghị sử dụng xargsđể di chuyển từng tệp riêng lẻ trong một vòng lặp như thời trang. Một cách để khắc phục điều đó là làm:

ls -1 | grep IDENTIFIER | xargs -i mv {} /path/to/dest/folder/

Các ls -1(trừ một) đảm bảo rằng chỉ có một tên tập tin trên mỗi dòng. Nếu bạn có các bí danh ẩn cho lslệnh, bạn có thể có nhiều tên tệp trên một dòng và vô tình di chuyển tệp mà bạn không có ý định di chuyển.


Điều này cũng hữu ích khi IDENTIFIER của bạn không dễ dàng biến thành ký tự đại diện hoặc bạn muốn sử dụng grep với regex phức tạp hơn.
AggieBill

1
+1 cho xargs. tìm thấy hầu như luôn luôn tốt hơn và an toàn hơn ls. tìm thấy . IDENTIFIER -exec mv {} / path / to / Dest / thư mục \; (mã chưa được kiểm tra) The. là cho các thư mục làm việc hiện tại. Các \; là kết thúc lệnh được thực thi. Tùy thuộc vào những gì bạn đang làm, bạn có thể phải thêm -maxdepth 1 để giữ cho nó không bị đệ quy vào các thư mục con.
Joe

5

Nếu các tập tin trong cùng một thư mục bạn có thể sử dụng

mv /path/to/source/dir/{file1,file2,*.ext1,*.ext2} /path/to/destination/

(đã thử nghiệm trong Ubuntu 16.04)


1
Điều này không thực sự thêm một cái gì đó vào câu trả lời hiện có, bạn có nghĩ vậy không?
tráng miệng

1
chỉ cần loại bỏ sự cần thiết phải chỉ định đường dẫn đầy đủ đến thư mục cho mỗi tệp
Sruli

3
find -type f -name "[range]" -exec mv {} target-directory ';'

lệnh này sẽ di chuyển tên tệp với bất kỳ mẫu / phạm vi nào vào thư mục đích.

ví dụ.

find -type f -name "file[1-50000]" -exec mv {} target-directory ';'

nó sẽ di chuyển các tập tin với tên như file1, file2... file50000đến target-directory.


2

Bạn có thể sử dụng đầu ra từ ls để nhập vào mv commnad

mv $(ls | grep IDENTIFIER) /path/to/dest/dir

Lệnh giữa $()trả về một danh sách các tên tệp khớp với tìm kiếm của bạn và có thể được cung cấp dưới dạng tham số cho lệnh mv.



1

Sử dụng lệnh này, bạn có thể di chuyển nhiều tập tin.

mv SourceFilenames ~DestinationPath


1

Cách dễ nhất là như thế này

mv {file1,file2,file3} DESTINATION

hoặc thư mục

mv {directory1,directory2,directory3} DESTINATION

hoặc cả tệp và thư mục

mv {file1,file2,file3,directory1,directory2,directory3} DESTINATION

Hi vọng điêu nay co ich

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.