2010-11-01 38 views
50

Tôi muốn tạo bản sao cấu trúc của máy chủ tệp nhiều terabyte của chúng tôi. Tôi biết rằng cp -parents có thể di chuyển một tập tin và đó là cấu trúc cha mẹ, nhưng có cách nào để sao chép cấu trúc thư mục còn nguyên vẹn không?Sao chép cấu trúc thư mục (tệp sans) từ một vị trí khác

Tôi muốn sao chép sang hệ thống Linux và máy chủ tệp của chúng tôi là CIFS được gắn ở đó.

+0

có thể trùng lặp của [? Rsync làm thế nào để bao gồm các thư mục nhưng không phải file] (https://stackoverflow.com/questions/3546001/rsync-how-to- bao gồm các thư mục-nhưng-không-tệp) –

Trả lời

98

Bạn có thể làm một cái gì đó như:

find . -type d >dirs.txt 

để tạo ra danh sách các thư mục, sau đó

xargs mkdir -p <dirs.txt 

để tạo ra các thư mục trên Nơi Đến.

+17

linux là tuyệt vời – user1167442

+5

Giải pháp này sẽ không hoạt động nếu bạn có dấu cách trong tên thư mục của mình. – Jealie

+10

@Jealie Thay đổi lệnh thành 'tìm. -type d -print0> dirs.txt' và 'xargs -0 mkdir -p user1207177

0

Nếu bạn có thể truy cập từ một máy Windows, bạn có thể sử dụng xcopy với/T và/E để sao chép chỉ là cấu trúc thư mục (thư mục/E bao gồm thư mục rỗng)

http://ss64.com/nt/xcopy.html

[EDIT! ]

Điều này sử dụng rsync để tạo lại cấu trúc thư mục nhưng không có tệp. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

Có thể thực sự được tốt hơn :)

+0

Linux, người đàn ông. Linux. Không phải cửa sổ $. – amphetamachine

+1

Thật không may, máy chủ lưu trữ CIFS phục vụ của chúng tôi không chạy các cửa sổ, vì vậy không thể thực hiện các lệnh thắng. – r00fus

+0

Cảm ơn bạn, phương pháp rsync đã làm việc hoàn toàn tốt cho tôi. Nó tương thích với không gian trong tên thư mục là tốt. – Glutanimate

50
cd /path/to/directories && 
find . -type d -exec mkdir -p -- /path/to/backup/{} \; 
+0

hoạt động như ma thuật;) – Volvox

+0

Đây là lời khuyên tối thượng! : –

+2

Câu trả lời hay nhất từ ​​tôi với tìm. Khác bạn có thể thử giải pháp 'rsync' từ câu trả lời của Chen Levy trong [câu hỏi SO này] (http://stackoverflow.com/questions/11946465/copy-a-directory-structure-with-file-names-without-content) –

5

Tôi không biết nếu bạn đang tìm kiếm giải pháp trên Linux. Nếu vậy, bạn có thể thử này:

$ mkdir destdir 
$ cd sourcedir 
$ find . -type d | cpio -pdvm destdir 
+0

cpio dường như không hoạt động với tôi, ít nhất với các tham số bạn đã chỉ định. – r00fus

+0

@ r00fus - vui lòng đọc hướng dẫn sử dụng cho cpio hoặc tham khảo http://www.gnu.org/software/cpio/ – zerodin

1

thay target_dirsource_dir với các giá trị thích hợp:

cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}" 

Tested trên OSX + Ubuntu.

1

Các giải pháp sau đây làm việc tốt cho tôi trong các môi trường khác nhau:

sourceDir="some/directory" 
targetDir="any/other/directory" 

find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p 
2

này hoạt động:

find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}" 

Chỉ cần thay thế SOURCE_DIR và DEST_DIR.

3

Bản sao này các thư mục và các tập tin thuộc tính, nhưng không phải là tập tin dữ liệu:

cp -R --attributes-only SOURCE DEST 

Sau đó, bạn có thể xóa các tập tin thuộc tính nếu bạn không quan tâm đến họ:

find DEST -type f -exec rm {} \; 
+0

Chỉ cần exellent one !. – WebComer

+0

Có thể là một điều tuyệt vời, nhưng bạn quên đề cập đến việc lưu quyền sở hữu, dấu thời gian và quyền. Vì vậy, nó tạo ra một mớ hỗn độn trong Win7/cygwin - NULL_SID người sử dụng, trật tự cấp phép sai, không thể chỉnh sửa quyền, vv và không thể truy cập được sản xuất filestructure. – WebComer

0

Một kịch bản python từ Sergiy Kolodyazhnyy được đăng trên Copy only folders not files?:

#!/usr/bin/env python 
import os,sys 
dirs=[ r for r,s,f in os.walk(".") if r != "."] 
for i in dirs: 
    os.makedirs(os.path.join(sys.argv[1],i)) 
.210

hoặc từ vỏ:

python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination 

FYI:

9

Đây là một giải pháp đơn giản sử dụng rsync:

rsync -av -f"+ */" -f"- *" "$source" "$target" 
  • một dòng
  • không có vấn đề với không gian
  • giữ gìn quyền

I found this solution there

1

Điều này giải quyết ngay cả những vấn đề với khoảng trắng:

Trong bản gốc dir/nguồn:

find . -type d -exec echo "'{}'" \; > dirs2.txt 

sau đó tái tạo lại nó trong thư mục mới được tạo ra:

mkdir -p <../<SOURCEDIR>/dirs2.txt 
Các vấn đề liên quan