Tôi tự hỏi - làm thế nào tôi có thể di chuyển tất cả các tệp trong một thư mục ngoại trừ các tệp đó trong một thư mục cụ thể (như 'mv' không có tùy chọn '--exclude')?Làm thế nào để sử dụng lệnh 'mv' để di chuyển các tệp ngoại trừ các tệp trong một thư mục cụ thể?
Trả lời
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 child1
và child2
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
.
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) –
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
Derp, chỉ cần nhận ra các bình luận ở trên là cần thiết cho bash. – Pred
Đâ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.
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
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
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
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).
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 \;
đ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 –
xem http://unix.stackexchange.com/questions/2020/command-line-mv-exclusion-list –