Cách di chuyển chỉ các tệp trong Unix


18

Làm cách nào tôi chỉ có thể di chuyển các tệp đơn giản (không phải thư mục) từ một thư mục trong Linux sang thư mục khác bằng mvlệnh?

Tôi đã thử mv * ~/, nhưng nó sao chép mọi thứ kể cả các thư mục.


ý kiến ​​của bạn đề cập đến một hạn chế bổ sung: lệnh không nên di chuyển các tệp ẩn khỏi thư mục làm việc hiện tại. Nếu điều này là chính xác, bạn có thể vui lòng chỉnh sửa câu hỏi của bạn để đề cập đến điều này? nói "di chuyển chỉ các tệp" làm cho chúng ta nghĩ "di chuyển tất cả các tệp", bao gồm các tệp ẩn.
quack quixote

Câu trả lời:


29

Bạn co thể thử

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
Wow, một người biết sử dụng find. Để hoàn thiện, bạn nên sử dụng -name [^.] * Trong find, tức là --- find. -maxdepth 1 -type f -name [^.] * -exec mv {} path \;
chris

KHÔNG SAO CHÉP-PASTE NÀY VÀO SHELL CỦA BẠN. Dấu chấm phẩy sẽ khiến nó thực thi ngay lập tức. :)
Sherwood Callaway

@SherwoodCallaway Dấu chấm phẩy là đánh dấu sự kết thúc của-exec
dstonek

4

Tôi là một chàng trai "sử dụng búa cho mọi thứ" vì vậy tôi sử dụng các chương trình vỏ bourne cho những thứ người khác sử dụng các chương trình bên ngoài cho ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

Một số người thích hoàn thành công việc đánh máy càng ít càng tốt nhưng tôi là một người đánh máy khá nhanh và tôi đã có những thứ như thế này được tích hợp trong não nên không quá đau đớn để làm điều này thay vì tìm kiếm chính xác đối số để tìm và thực hiện và tất cả điều đó.

YMMV, mặc dù ...


cảm ơn vì điều đó tôi sẽ thử nó nhưng tôi vẫn cần câu trả lời khác vì đó là dự án tôi đang thực hiện trong khóa học linux. cảm ơn rất nhiều

1
Đây một câu trả lời cho câu hỏi của bạn. mv không có hiểu biết về các tập tin hoặc thư mục hoặc fifos hoặc các tập tin đặc biệt khác. mv chỉ hiểu các mục nhập và inodes thư mục, và theo như nó có liên quan, chúng đều giống nhau bất kể loại tệp. Để cho phép mv chỉ di chuyển một loại tệp cụ thể, bạn cần một cái gì đó như kiểm tra hoặc tìm thấy thực sự có thể nhìn vào nút để xem tệp đó là gì. Nói cách khác, bạn đang được hỏi một câu hỏi mẹo nếu bạn được yêu cầu làm điều đó chỉ với mv.
chris

1
Và tôi nói mv mà hiểu inodes chỉ vì nó có thể di chuyển một tập tin từ một hệ thống tập tin khác, đó là về mặt kỹ thuật một cp sau đó một rm, không phải là một mv (mà thực sự chỉ là một ln sau đó rm). Nhìn liên kết cứng và các mục thư mục.
chris

2
shorty: Đây là một câu trả lời hay, bạn phải sử dụng một cái gì đó bên cạnh lệnh mv (ít nhất là shell). Đây là về một cơ bản như nó được mà không cần lập trình.
Kyle Brandt

3

@Mereghost rất gần. Đây là những gì tôi có thể di chuyển tất cả các tệp (bao gồm các tệp ẩn), nhưng không phải là thư mục:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

Việc .tìm kiếm giả định thư mục hiện tại của bạn là nguồn của các tệp bạn muốn di chuyển. Nếu không, lệnh có thể được sửa đổi, như sau:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

Nếu bạn chỉ muốn di chuyển các tệp thông thường và không ẩn các tệp:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

Nếu bạn chỉ muốn di chuyển các tệp bị ẩn và không phải các tệp thông thường:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

Nếu bạn không có thư mục có tên có dấu chấm trong đó, bạn có thể di chuyển tất cả chúng một cách đơn giản:

mv . ~ / đích đến

(Giả định của tôi là tất cả các tệp của bạn là một cái gì đó. Một cái gì đó (trong trường hợp của tôi là tất cả thường)

NHƯNG nhờ các câu trả lời khác - rất hữu ích. cám ơn


-1

bạn có thể sử dụng tìm

find * -maxdepth 1 -type f -exec mv {} ~ \;

Vâng, nó hoạt động tốt nhưng không phải 100%, nó đã sao chép tất cả các tệp từ thư mục và thư mục con sang ~ / location. tôi chỉ cần một cái gì đó rất cơ bản là sao chép các tập tin mà không có các tập tin ẩn từ thư mục tôi đang chuyển sang một thư mục khác. đó là nó. dù sao cũng cảm ơn vì lời khuyên

Điều đó là không thể với maxdepth là 1.
John T

Đã sửa nên nó sẽ không sao chép các tập tin ẩn.
John T

1
Cú pháp trên find là find sau đó là một thư mục mô tả các hoạt động và những thứ phù hợp. Thông thường, người ta sẽ không bao giờ sử dụng ký tự đại diện như find * mà không bảo vệ nó khỏi toàn cầu (tức là find / path / to / thư mục -name goo * -type f.
Chris

1
Tìm chỉ hoạt động đúng nếu bạn đưa cho nó một con đường duy nhất để kiểm tra. Trong ví dụ của bạn, ví dụ, nếu có bất kỳ tệp nào bắt đầu bằng - find sẽ phát nổ bất ngờ. Bạn luôn luôn tốt hơn khi chỉ có một chương trình đọc mục nhập thư mục và trong ví dụ của bạn, bạn đang sử dụng hai chương trình khác nhau (tìm và trình bao).
chris

-2

mv `tìm ./sourcedir/* -type f` ./destdir


2
Điều này sẽ thất bại cho bất kỳ tập tin có chứa khoảng trắng trong tên của họ. Đầu ra của các lệnh in tên tệp không bao giờ được phân tích cú pháp trừ khi có thể được đảm bảo rằng nó được phân tách chính xác. Xem lý do tại sao bạn không nên phân tích đầu ra của ls (1) cho ý chính. Sử dụng find's -execlựa chọn là cách tốt nhất để tránh vấn đề.
slhck
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.