Chỉ sao chép các thư mục không phải tập tin?


16

Có cách nào để sao chép toàn bộ thư mục, nhưng chỉ các thư mục không? Tôi có một tập tin bị hỏng ở đâu đó trong thư mục của tôi, điều đó làm cho đĩa cứng của tôi bị lỗi.

Vì vậy, thay vì sao chép tệp bị hỏng sang đĩa cứng khác, tôi chỉ muốn sao chép các thư mục, vì tôi có các tập lệnh tìm kiếm hàng trăm thư mục và tôi không muốn phải tự tạo tất cả.

Tôi đã tìm kiếm hướng dẫn cp, nhưng không thể thấy bất cứ điều gì (tôi có thể đã bỏ lỡ nó)

Nói rằng tôi có cấu trúc này trên ổ cứng bị lỗi của tôi:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

Tất cả tôi muốn là cấu trúc thư mục, không phải bất kỳ tập tin nào cả.

Vì vậy, tôi đã kết thúc với ổ cứng mới:

dir1
    dir2
        dir4
dir3

Hy vọng ai đó biết một số thủ thuật!


Bạn có nghĩa là bạn chỉ muốn sao chép cấu trúc thư mục hoặc bạn chỉ muốn loại trừ các tệp trong thư mục làm việc hiện tại (và tất cả các tệp khác trong thư mục con sâu hơn là trò chơi)?
Oli

Tôi đã thêm một ví dụ. xin lỗi vì đã gây nhầm lẫn
Shannon

1
FYI sử dụng rsyncđể sao chép cấu trúc thư mục VÀ giữ lại các quyền và thuộc tính] ( stackoverflow.com/a/9242883/52074 ). Sử dụng đồng bằng mkdir -p không bảo vệ quyền và thuộc tính .
Trevor Boyd Smith

Câu trả lời:


15

Nếu bạn muốn phản chiếu bộ xương thư mục và sao chép không có tệp:

find -type d -links 2 -exec mkdir -p "/path/to/backup/{}" \;

Những gì đang xảy ra ở đây:

  • Tìm chỉ là chọn thư mục
  • Chúng tôi đang sử dụng -links 2để tìm các thư mục sâu nhất có thể .
  • mkdir -p sẽ làm cho bất kỳ thư mục bị thiếu trên đường đi.

Tôi đã thực hiện nó như thế này hơn là find -type d -exec mkdir -p "/path/to/backup/{}" \;vì nó sẽ cắt đứt toàn bộ số lượng mkdircuộc gọi. Chúng tôi có thể nhanh chóng chứng minh điều này với một bài kiểm tra nhỏ. Đây là cây thử nghiệm theo sau là những gì tôi đã chạy để so sánh hai lệnh:

$ tree
.
├── dir1
│   ├── dir2
│   │   └── dir3
│   ├── dir7
│   └── dir8
└── dir9
    └── dir0

$ pr -m -t <(find -type d) <(find -type d -links 2)
.                               ./dir1/dir8
./dir1                          ./dir1/dir2/dir3
./dir1/dir8                     ./dir1/dir7
./dir1/dir2                     ./dir9/dir0
./dir1/dir2/dir3
./dir1/dir7
./dir9                  
./dir9/dir0 

Và điều đó sẽ chỉ trở nên tốt hơn trong một giải pháp thực sự với hàng ngàn thư mục.


Đây là tôi là một người mới, tuy nhiên làm thế nào bạn tìm kiếm thư mục cũ để sao chép vào bản sao lưu? Tôi chỉ có thể thấy một con đường ở đây
Shannon

Nếu bạn không chỉ định đường dẫn, hãy findsử dụng thư mục làm việc hiện tại làm điểm bắt đầu. Nếu bạn muốn sử dụng một đường dẫn khác, hãy sử dụng cú pháp:find /path/to/search/ -type.....
Oli

Vì vậy, tôi đặt thư mục của mình vào một thư mục nhất định có chứa bộ xương tôi muốn sao chép, chạy find -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;và tất cả sẽ ổn chứ? Có vẻ như sẽ mất một lúc: /
Shannon

Tôi chạy cái này từ terminal bình thường phải không?
Shannon

1
Cả hai đều cụ thể để tìm mệnh đề exec. {} có nghĩa là tên tệp "tìm thấy" hiện tại và \; chỉ là lối thoát để kết thúc mệnh đề. Nhìn bề ngoài, có thêm một "trong mã của bạn không tốt, tôi chắc chắn ... Nên đọc:find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
Oli

2

Khá dễ dàng thực hiện với python one-liner:

bash-4.3$ tree
.
├── ABC
├── set_pathname_icon.py
├── subdir1
│   ├── file1.abc
│   └── file2.abc
├── subdir2
│   ├── file1.abc
│   └── file2.abc
└── subdir3
    └── subdir4
        └── file1.txt

4 directories, 7 files
bash-4.3$ 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
bash-4.3$ tree ~/new_destination
/home/xieerqi/new_destination
├── subdir1
├── subdir2
└── subdir3
    └── subdir4

Như kịch bản này có thể được viết lại như vậy:

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