Điểm:0

rsync một thư mục với hậu duệ của chính nó

lá cờ gr

tl;dr: tôi muốn rsync một thư mục cho hậu duệ của chính nó, và sau đó rsync hậu duệ đã nói trở lại thư mục gốc--bao gồm xóa và loại trừ theo cả hai hướng.

Trước khi bạn đặt câu hỏi rõ ràng, "Tại sao bạn muốn làm điều đó?" hoặc chỉ ra cách tiếp cận khác sẽ tốt hơn bao nhiêu, đây là một yêu cầu kinh doanh. Đó không phải là lựa chọn của tôi và tôi nhận thức được những rủi ro, vì vậy hãy chiều chuộng tôi. Tôi không có ý định biện minh cho cách tiếp cận này nữa.

Chi tiết:

tôi muốn rsync một thư mục cho hậu duệ của chính nó--tức là, một thư mục "bên dưới" hoặc "bên trong" nó, như cha mẹ đến cha mẹ/con cái, ví dụ--và sau đó đồng bộ hóa các thay đổi với hậu duệ trở lại thư mục ban đầu, ví dụ: cha mẹ/con cái đến cha mẹ, bao gồm xóa và loại trừ theo cả hai hướng. Trực quan, tôi cần phải làm điều này:

cha mẹ -> cha/con
cha mẹ <- cha mẹ/con cái

Những khó khăn là để...

  1. Ngăn chặn đệ quy vô hạn khi đi từ tổ tiên đến hậu duệ
  2. Không xóa các tệp nguồn giữa chừng khi đồng bộ hóa hậu duệ trở lại tổ tiên của nó (biểu hiện là lỗi "tệp đã biến mất")
  3. Luôn tôn trọng các loại trừ
Điểm:0
lá cờ pk

Một cách tiếp cận khác là thiết lập các liên kết gắn kết và do đó làm cho hai cây xuất hiện độc lập, sau đó rsync như bình thường:

mkdir /mnt/cha mẹ
mkdir /mnt/con
mkdir /mnt/trống
gắn kết --bind/đường dẫn/đến/cha mẹ/con/mnt/con
mount --bind /path/to/parent /mnt/parent
gắn kết --bind /mnt/trống /mnt/cha mẹ/con

Bây giờ, khi bạn làm

rsync [args] /mnt/parent/. /mnt/con/.

thư mục trống /mnt/trống sẽ che giấu sự thật /đường dẫn/đến/cha mẹ/con danh mục; /mnt/cha/con sẽ xuất hiện trống và sẽ tránh được đệ quy vô hạn.

khi bạn làm

rsync [args] /mnt/child/. /mnt/cha/.

tình hình sẽ tương tự; /mnt/con/con/ sẽ trống (vì bạn không sao chép bất cứ thứ gì ở đó ngay từ đầu) và /mnt/cha mẹ/con/ cũng sẽ xuất hiện trống, vì vậy không có nguy cơ xóa bất kỳ thứ gì từ đó.

Điều này có lẽ kém tao nhã hơn giải pháp của @TravisCarden, nhưng có thể mạnh mẽ hơn.

lá cờ gr
Thật thú vị! Thật không may, tôi không thể tin tưởng vào đối tượng mục tiêu cụ thể của mình có quyền truy cập để gắn kết hoặc tôi sẽ thử điều này, nhưng cảm ơn vì ý tưởng này!
Điểm:0
lá cờ gr

Có ba phần của giải pháp. Theo thứ tự...

  1. Loại trừ đường dẫn thư mục con cháu so với tổ tiên, ví dụ., trẻ em khi đồng bộ hóa từ cha mẹ/con cái
  2. Sử dụng --delete-after cờ thay vì --xóa bỏ
  3. Tạo tất cả các đường dẫn loại trừ liên quan đến nguồn, ví dụ: loại trừ.txt như trái ngược với /var/www/parent/exclude.txt

Đây là tập lệnh thử nghiệm (với một số định dạng đặc biệt để có đầu ra đẹp hơn):

#!/usr/bin/env bash

xa lạ

printf "\n\e[33mrsync version:\n"
printf "%s---------------\e[39m\n"

rsync --version | đầu -n 1
# giao thức rsync phiên bản 2.6.9 phiên bản 29

rm -r phụ huynh

mkdir -p cha mẹ

chạm vào cha mẹ/bản gốc.txt \
      cha mẹ/xóa-từ-con.txt \
      cha mẹ/loại trừ khỏi con.txt

printf "\n\e[33mTrạng thái ban đầu:\n"
printf "%s---------------\e[39m\n"

cây -a --noreport -- cha mẹ

printf "\n\e[33mrsync to con:\n"
printf "%s---------------\e[39m\n"

printf "rsync --archive \n --delete-after \n --exclude=exclude-from-child.txt \n "$PWD"/cha mẹ/ \n "$PWD"/cha mẹ/con\ n\n"
rsync --archive \
      --delete-after \
      --exclude=loại trừ-từ-trẻ em.txt \
      "$PWD"/cha mẹ/ \
      "$PWD"/cha/mẹ/con

cây -a --noreport -- cha mẹ; tiếng vang

printf "\e[33mThực hiện thay đổi:\n"
printf "%s---------------\e[39m\n"

rm cha mẹ/con/xóa-từ-con.txt
printf "rm cha/con/xóa-từ-con.txt\n"
chạm vào cha mẹ/con/tạo-trong-con.txt
printf "chạm vào cha mẹ/con/tạo-trong-con.txt\n"
chạm vào cha mẹ/con/loại trừ khỏi cha mẹ.txt
printf "chạm vào cha mẹ/con/loại trừ khỏi cha mẹ.txt\n\n"

printf "\e[33mrsync back to parent:\n"
printf "%s----------------------\e[39m\n"

printf "rsync --archive \n --delete-after \n --exclude=child \n --exclude=exclude-from-child.txt \n --exclude=exclude-from-parent.txt \n "$PWD"/cha mẹ/con/ \n "$PWD"/cha mẹ\n\n"
rsync --archive \
      --delete-after \
      --exclude=con \
      --exclude=loại trừ-từ-trẻ em.txt \
      --exclude=loại trừ-từ-cha mẹ.txt \
      "$PWD"/cha mẹ/con/ \
      "$PWD"/phụ huynh

cây -a --noreport -- cha mẹ; tiếng vang
# Hoặc `tìm cha -type f; echo`, nếu bạn không có `tree`

printf "%s\n\e[33mSo sánh cuối cùng:\n"
printf "%s-----------------\e[39m\n"

diff --exclude=con cha mẹ/con; tiếng vang

Đầu ra:

phiên bản rsync:
--------------
rsync phiên bản 2.6.9 giao thức phiên bản 29

Trạng thái ban đầu:
---------------
cha mẹ
âââ xóa-từ-con.txt
âââ loại trừ khỏi con.txt
âââ original.txt

rsync cho con:
---------------
rsync --archive
      --delete-after
      --exclude=loại trừ khỏi con.txt
      /var/www/cha mẹ/
      /var/www/cha mẹ/con

cha mẹ
âââ con
â âââ xóa-từ-con.txt
â âââ original.txt
âââ xóa-từ-con.txt
âââ loại trừ khỏi con.txt
âââ original.txt

Thực hiện các thay đổi:
---------------
rm cha mẹ/con/xóa-từ-con.txt
chạm vào cha mẹ/con/tạo-trong-con.txt
chạm vào cha mẹ/con/loại trừ khỏi cha mẹ.txt

rsync trở lại cha mẹ:
---------------------
rsync --archive
      --delete-after
      --exclude=con
      --exclude=loại trừ khỏi con.txt
      --exclude=loại trừ-từ-parent.txt
      /var/www/cha mẹ/con/
      /var/www/cha mẹ

cha mẹ
âââ con
â âââ tạo-in-child.txt
â âââ loại trừ khỏi cha mẹ.txt
â âââ original.txt
âââ tạo-in-child.txt
âââ loại trừ khỏi con.txt
âââ original.txt


So sánh cuối cùng:
-----------------
Chỉ trong cha mẹ: loại trừ khỏi con.txt
Chỉ trong cha mẹ/con: loại trừ khỏi cha mẹ.txt

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.