2011-01-06 21 views

Trả lời

52

Cho phép giả định cấu trúc thư mục là như thế,

|parent 
    |--child1 
    |--child2 
    |--grandChild1 
    |--grandChild2 
    |--grandChild3 
    |--grandChild4 
    |--grandChild5 
    |--grandChild6 

Và chúng tôi cần di chuyển các tệp để nó xuất hiện như thế,

|parent 
    |--child1 
    | |--grandChild1 
    | |--grandChild2 
    | |--grandChild3 
    | |--grandChild4 
    | |--grandChild5 
    | |--grandChild6 
    |--child2 

Trong trường hợp này, bạn cần loại trừ e hai thư mục child1child2 và chuyển các thư mục còn lại vào thư mục child1.

sử dụng,

mv !(child1|child2) child1 

này sẽ di chuyển tất cả các phần còn lại của các thư mục vào thư mục child1.

+11

Mẹo: Lưu ý rằng việc sử dụng mẫu này dựa trên 'extglob'. Bạn có thể kích hoạt nó bằng cách sử dụng 'shopt -s extglob' (Nếu bạn muốn' mở rộng globs' được bật theo mặc định, bạn có thể thêm 'shopt -s extglob' vào .bashrc) –

+2

Tôi tiếp tục nhận được' -bash:!: Event không tìm thấy' khi cố gắng thực hiện lệnh này. – Pred

+0

Derp, chỉ cần nhận ra các bình luận ở trên là cần thiết cho bash. – Pred

1

Đây không phải là chính xác những gì bạn yêu cầu, nhưng nó có thể thực hiện công việc: (. Về cơ bản, di chuyển thư mục loại trừ ra khỏi cây lớn hơn để được di chuyển)

mv the-folder-you-want-to-exclude somewhere-outside-of-the-main-tree 
mv the-tree where-you-want-it 
mv the-excluded-folder original-location 

Vì vậy, , nếu tôi có a/ và tôi muốn loại trừ a/b/c/*:

mv a/b/c ../c 
mv a final_destination 
mkdir -p a/b 
mv ../c a/b/c 

Hoặc điều gì đó tương tự. Nếu không, bạn có thể nhận được find để trợ giúp bạn.

+0

Và nếu các tệp bạn đang di chuyển nằm trong thư mục gốc của bạn? Một số hệ thống, ví dụ, chỉ cung cấp cho người dùng quyền truy cập vào một thư mục (một số IDE đám mây là một ví dụ tốt). Có thể ai đó muốn di chuyển mọi thứ vào thư mục con. Điều này sẽ không hoạt động. – Kallaste

+0

Như tôi đã nói (sáu năm trước), câu trả lời không mô tả chính xác những gì được yêu cầu, và nó chỉ * có thể * thực hiện công việc. Đối với hầu hết các trường hợp, nó sẽ hoạt động; chắc chắn, bạn là một ngoại lệ cho điều đó. – Thanatos

+0

Bạn nói đúng, nó không. Nhưng quan điểm của tôi không phải là nó không phải là những gì được yêu cầu, nhưng nó trong một số trường hợp sẽ không hoạt động. Ví dụ của tôi chỉ là một giả thuyết để chứng minh điều đó. – Kallaste

3

Kể từ khi tìm thấy không có một tùy chọn loại trừ, sử dụng tìm + xargs + mv:

find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory 

Lưu ý rằng điều này gần như sao chép từ các trang tìm người đàn ông (Tôi nghĩ rằng sử dụng mv --target-thư mục là tốt hơn so với cpio).

1

này sẽ di chuyển tất cả các file bằng hoặc thấp hơn thư mục hiện không có trong thư mục ./exclude/ đến/bất cứ nơi nào ...

find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \; 
+0

điều này sẽ bỏ qua cấu trúc thư mục và sao chép tất cả các tệp trong thư mục con thành một cấu trúc thư mục phẳng. a/b/c/->/bất cứ nơi nào a/b.txt ->/anywhere –