Sao chép các thư mục con cụ thể có cấu trúc thư mục vào một thư mục mới


8

Tôi đang có một cấu trúc thư mục sau:

                Main_Dir
                   |
  -----------------------------------
  Subdir1       Subdir2       Subdir3
     |             |             |
 ---------     ---------     ---------
 |   |   |     |   |   |     |   |   |            
fo1 fo2 f03   fo1 fo2 f03   fo1 fo2 f03

Tôi muốn sao chép tất cả các thư mục con ( Subdir1, Subdir2, Subdir3) vào một thư mục mới. Nhưng tôi chỉ muốn sao chép fo1fo2thư mục ở nơi mới.

Không chắc làm thế nào nó có thể được thực hiện.


Sao chép mọi thứ, xóa fo3?
ChuckCottrill

Câu trả lời:


4

Nếu cây thư mục không chỉ đơn thuần là ..../f03bạn có thể sử dụng rsynclệnh này để sao chép mọi fo1& fo2và loại trừ mọi thư mục khác có tên fo*.

$ rsync -avz --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

Khi xử lý các loại kịch bản sao chép này, tôi luôn sử dụng rsyncvà nó --dry-run& --verbosechuyển đổi để tôi có thể thấy những gì nó sẽ làm mà không thực sự phải sao chép các tệp.

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

Thí dụ

Chạy khô.

$ rsync -avz --dry-run --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.
sending incremental file list
./

Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Nếu bạn muốn xem một số rsynclogic bên trong về những gì đang được bao gồm / loại trừ thì hãy sử dụng công --verbosetắc.

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

sending incremental file list
[sender] showing directory Subdir1/fo2 because of pattern fo[12]/
[sender] showing directory Subdir1/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir1/fo3 because of pattern fo*/
[sender] showing directory Subdir2/fo2 because of pattern fo[12]/
[sender] showing directory Subdir2/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir2/fo3 because of pattern fo*/
[sender] showing directory Subdir3/fo2 because of pattern fo[12]/
[sender] showing directory Subdir3/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir3/fo3 because of pattern fo*/
delta-transmission disabled for local transfer or --whole-file
./
Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Nếu bạn cần loại trừ các dạng thư mục khác, bạn có thể thêm nhiều loại trừ.


3

Sử dụng rsync:

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination

0

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

find Main_Dir -maxdepth 1 -mindepth 1 -type d | while IFS= read -r subdir; do
   mkdir -p new_dir/"$(basename $subdir)" && 
   cp -r "$subdir"/{fo1,fo2} new_dir/"$(basename $subdir)"/; 
done

Các findlệnh trả về tất cả các thư mục con trực tiếp của Main_Dir. basenamesẽ trả về tên của thư mục con được tìm thấy (ví dụ basename Main_Dir/Subdir1trả về Subdir1). Sau đó, bạn sử dụng mở rộng dấu ngoặc của shell để tránh gõ fo1fo2nhiều lần và sao chép chúng vào phần mới được tạonew_dir/$(basename $subdir) .

Trong trường hợp cụ thể bạn đề cập đến nơi chỉ có thư mục bên dưới Main_Dirvà nơi không có khoảng trắng hoặc ký tự lạ trong tên, bạn có thể đơn giản hóa phần trên để

cd Main_Dir; for subdir in *; do 
  mkdir -p ../new_dir/$subdir && cp -rv $subdir/{fo1,fo2} ../new_dir/$subdir; 
done

0

Nếu cấu trúc thư mục của bạn chính xác như trong ví dụ của bạn (tức là tất cả các fotệp đều ở cùng cấp độ):

mkdir -p New_Dir/{Subdir1,Subdir2,Subdir3}
for subdir in Subdir1 Subdir2 Subdir3;do
    cp -r Main_Dir/"$dir"/{fo1,fo2} New_Dir/"$dir"/
done
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.