2012-02-27 25 views
8

Tôi có 1 thư mục với 9 thư mục con và 10 tệp. Thư mục con có các thư mục con và thư mục cấp tiếp theo.cp dir đệ quy không bao gồm 2 subdirs

/home/directory/ 
/home/directory/subdirectory1 
/home/directory/subdirectory2 
... 
/home/directory/subdirectory9 
/home/directory/file1 
... 
/home/directory/file10 

Tôi muốn sao chép tất cả các thư mục con và các tập tin recursivly trừ:

/home/directory/subdirectory5 
/home/directory/subdirectory7 

cách tốt nhất cho nó là gì?

+0

bản sao đầu tiên thư mục hoàn chỉnh một cách đệ quy, sau đó sử dụng lệnh rm để loại bỏ các thư mục con 5 & 7 – Pradeep

+0

thể trùng lặp của [thư mục Sao chép một cách đệ quy, trừ một số thư mục] (http: // stackoverflow. com/questions/2193584/copy-folder-đệ quy-loại trừ-một số-thư mục) –

Trả lời

8

lẽ lệnh find sẽ giúp bạn: cách

$ find /home/directory -mindepth 1 -maxdepth 1 -name 'subdirectory[57]' -or -exec cp -r {} /path/to/dir \; 
+1

điều này không bảo vệ cấu trúc cây thư mục, @kjohri 's trả lời với rsync là tốt hơn nhiều – arod

+0

lệnh này thậm chí không làm việc cho tôi, nó nói -exec thiếu thông số – zozelfelfo

8

Tôi không biết cách làm tốt với cp, nhưng nó khá dễ sử dụng rsync và công tắc --exclude.

1

Kev là tốt hơn, nhưng điều này cũng sẽ làm việc:

find "/home/folder" -maxdepth 1 | sed -e "/^\/home\/folder$/d" -e "/^\/home\/folder\/subfolder5$/d" -e "/^\/home\/folder\/subfolder7$/d" -e "s/^/cp \-r /" -e "s/$/ \/home\/target/" | cat 

Giải thích:

find "/home/folder" -maxdepth 1 | 
// get all files and dirs under /home/folder, pipe output 

sed -e "/^\/home\/folder$/d" 
// have sed strip the path being searched, or the cp -r we prepend later will pickup the excluded dirs again. 

-e "/^\/home\/folder\/subfolder5$/d" 
// have sed strip subfolder5 

-e "/^\/home\/folder\/subfolder7$/d" 
// have sed strip subfolder7 

-e "s/^/cp \-r /" 
// have sed prepend "cp -r " to each line 

-e "s/$/ \/home\/target/" | cat 
// have sed append targetdir to each line. 

Đầu ra:

cp -r /home/folder/subfolder9 /home/target 
cp -r /home/folder/subfolder1 /home/target 
cp -r /home/folder/file10 /home/target 
cp -r /home/folder/subfolder2 /home/target 
cp -r /home/folder/file1 /home/target 
cp -r /home/folder/subfolder3 /home/target 

Thay đổi | cat thành | sh để thực thi lệnh.

< Một từ chối trách nhiệm lớn goes here >

Bạn nên giải pháp Kev là tốt hơn

+0

+1 đối với sed quá mức được truyền đến mèo hoặc cách tốt nhất để tạo các tập lệnh phức tạp khác. 1 cho câu trả lời đúng của Kev trong trường hợp này :) –

2

sử dụng rsync với --exclude là tốt hơn

+0

rsync là một cách tiếp cận tốt hơn. –

2

Bạn có thể sử dụng --exclude tùy chọn tar:

{ cd /home/directory; tar -c --exclude=subdirectory5 --exclude=subdirectory7 .; } | { cd _destination_ ; tar -x; } 
1

Tại sao không chỉ sử dụng cp lệnh như thế này:

cp -r /home/directory/!(subdirectory5|subdirectory7) /destination 
+2

Không hoạt động trong bash! đầu ra là "bash:!: sự kiện không tìm thấy" –

+1

Trong trường hợp này, bạn nên đặt cuộc gọi: ** shopt -s extglob ** và ** mkdir destination **. Sau đó, nó sẽ làm việc. – shadox

27
rsync -avz --exclude subdirectory5 --exclude subdirectory7 /home/directory/ target-path 
+0

rsync là con đường để đi. quên đi cp – thebugfinder

Các vấn đề liên quan