Sao chép cấu trúc thư mục (không có tệp) từ vị trí này sang vị trí khác


94

Tôi muốn tạo một 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 cha mẹ cp có thể di chuyển một tệp và đó là cấu trúc mẹ, nhưng có cách nào để sao chép nguyên vẹn cấu trúc thư mục không?

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



Giải pháp rsync từ bài đăng bình luận ở trên trông gọn gàng hơn.
YE

Câu trả lời:


158

Bạn có thể làm điều gì đó như:

find . -type d > dirs.txt

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

xargs mkdir -p < dirs.txt

để tạo các thư mục trên đích.


8
Các giải pháp này sẽ không hoạt động nếu bạn có khoảng trắng trong tên thư mục của mình.
Jealie

29
@Jealie Thay đổi các lệnh thành find . -type d -print0 >dirs.txtxargs -0 mkdir -p <dirs.txt. Điều này sẽ khiến cả hai lệnh sử dụng null làm dấu phân cách thay vì khoảng trắng.
user1207177

3
xargscó thể vượt quá độ dài lệnh tối đa của hệ thống khi bạn bắt đầu giao dịch với hàng trăm hoặc hàng nghìn lệnh, vì vậy hãy thận trọng khi sử dụng lệnh này. (Tìm giới hạn độ dài lệnh bằng getconf ARG_MAX.) Với nhiều thư mục, bạn có thể phải viết một tập lệnh để lặp qua đầu ra.
palswim

1
Và những gì về quyền và thuộc tính nó sẽ được giữ lại ??
Ashish Karpe

3
@TrevorBoydSmith: Cảm ơn nhận xét của bạn. Câu hỏi ban đầu không đề cập bất cứ điều gì về việc cần duy trì quyền, quyền sở hữu hoặc thuộc tính. Làm như vậy sẽ yêu cầu một giải pháp khác, như bạn đã đề cập, nhưng những điều trên là đủ để trả lời câu hỏi như đã đặt ra.
Greg Hewgill

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

3
Câu trả lời tốt nhất từ ​​tôi với tìm thấy. Khác bạn có thể thử rsyncgiải pháp từ Chen Levy câu trả lời trong câu hỏi SO này
Mat M

3
Tùy chọn của - mkdir là gì?
Bruce_Warrior

9
--là một trình kết thúc tùy chọn tiện ích GNU tiêu chuẩn. Nó có nghĩa là "hey mkdir, bất kỳ đối số nào sau đây, nó không phải là một cờ, vì vậy hãy coi nó như một đối số tệp, ngay cả khi nó bắt đầu bằng ký tự '-'."
amphetamachine

4
câu trả lời này cũng không giữ lại các quyền và thuộc tính của thư mục . Sử dụng rynsc để duy trì các quyền và thuộc tính
Trevor Boyd Smith

35

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

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • một đường thẳng
  • không có vấn đề với khoảng trắng
  • bảo toàn quyền

Tôi đã tìm thấy giải pháp này ở đó


10
tương tự nhưng dễ đọc hơnrsync -a --include '*/' --exclude '*' "$source" "$target"
Sylvain

1
Vấn đề với giải pháp này là: các thư mục của tôi chứa hàng nghìn tệp và rsync mất nhiều thời gian chỉ để đồng bộ hàng chục thư mục.
Christopher K.

6

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

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

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

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

6

Thao tác này sao chép các thuộc tính thư mục và tệp, nhưng không sao chép dữ liệu tệp:

cp -R --attributes-only SOURCE DEST

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

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

1
Sẽ là một trong những 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 - người dùng NULL_SID, sai thứ tự quyền, không thể chỉnh sửa quyền, v.v. và không thể truy cập cấu trúc lọc đã tạo.
WebComer

1
Tôi nên nghĩ rằng lỗi hoàn toàn nằm ở bất cứ ai cố gắng sử dụng Windows cho công việc thực sự.
tripleee

cp -R --attributes-only --preserve = all - parent -v SOURCE DEST
Gábor

2

Giải pháp sau hoạt động 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

Những công việc này:

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.


2

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

Trong dir gốc / nguồn:

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

sau đó tạo lại nó trong dir mới tạo:

mkdir -p <../<SOURCEDIR>/dirs2.txt

1

Thay thế target_dirsource_dirvới các giá trị thích hợp:

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

Đã thử nghiệm trên OSX + Ubuntu.


0

Một tập lệnh python từ Sergiy Kolodyazhnyy được đăng trên Chỉ sao chép thư mục chứ không phải tệp? :

#!/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)) 

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:


0

Một cách tiếp cận khác là sử dụng treecây thư mục khá tiện dụng và điều hướng dựa trên các tùy chọn mạnh mẽ của nó. Có các tùy chọn chỉ dành cho thư mục, loại trừ các thư mục trống, loại trừ tên có mẫu, chỉ bao gồm tên có mẫu, v.v. Kiểm traman tree

Ưu điểm : bạn có thể chỉnh sửa hoặc xem lại danh sách hoặc nếu bạn thực hiện nhiều tập lệnh và thường xuyên tạo hàng loạt thư mục trống

Phương pháp tiếp cận : tạo danh sách các thư mục bằng cách sử dụng tree, sử dụng danh sách đó làm đầu vào đối sốmkdir

tree -dfi --noreport > some_dir_file.txt

-dfi chỉ liệt kê các thư mục, in đường dẫn đầy đủ cho mỗi tên, làm cho cây không in các dòng thụt lề,

--noreport Bỏ qua việc in báo cáo tệp và thư mục ở cuối danh sách cây, chỉ để làm cho tệp đầu ra không chứa bất kỳ lông tơ nào

Sau đó đi đến đích nơi bạn muốn có các thư mục trống và thực thi

xargs mkdir < some_dir_file.txt

0
find source/ -type f  | rsync -a --exclude-from - source/ target/

Chỉ sao chép dir khi có quyền và quyền sở hữu liên quan


0

1 giải pháp dòng:

find . -type d -exec mkdir -p /path/to/copy/directory/tree/{} \;

-1

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

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

[BIÊN TẬP!]

Cái 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ự tốt hơn :)


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

Cảm ơn bạn, phương pháp rsync hoạt động hoàn toàn tốt đối với tôi. Nó cũng tương thích với các khoảng trắng trong tên thư mục.
Glutanimate

-1

Đây là một giải pháp trong php:

  • sao chép các thư mục (không đệ quy, chỉ một cấp)
  • bảo toàn quyền
  • không giống như giải pháp rsync, nhanh chóng ngay cả với các thư mục chứa hàng nghìn tệp vì nó thậm chí không đi vào các thư mục
  • không có vấn đề với khoảng trắng
  • nên dễ đọc và dễ điều chỉnh

Tạo một tệp như syncDirs.phpvới nội dung này:

<?php
foreach (new DirectoryIterator($argv[1]) as $f) {
    if($f->isDot() || !$f->isDir()) continue;
        mkdir($argv[2].'/'.$f->getFilename(), $f->getPerms());
        chown($argv[2].'/'.$f->getFilename(), $f->getOwner());
        chgrp($argv[2].'/'.$f->getFilename(), $f->getGroup());
}

Chạy nó với tư cách người dùng có đủ quyền:

sudo php syncDirs.php /var/source /var/destination


Bạn không cần phải thích PHP và bạn không cần phải sử dụng nó. Nhưng OP không nói rõ liệu ông ta có muốn một giải pháp bằng bất kỳ ngôn ngữ cụ thể nào hay không và dù muốn hay không, PHP vẫn được cài đặt trên nhiều hệ thống Linux vì 80% web sử dụng PHP ( w3techs.com/technologies/details/pl- php / all / tất cả ).
Christopher K.
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.