Bash

使用 rsync -r 命令包含點文件 (.x)

  • October 28, 2020

我有以下命令:

rsync -r --exclude="node_modules" "/r2g_shared_dir/vamoot"/* "/home/node/.docker_r2g_cache/b640e7fd-27a7-4dd8-8ca8-5363a1c59c35"

我剛剛意識到使用 /* 不會複製點文件(以 . 開頭的文件/文件夾)…

有人知道我如何包含這些文件嗎?

我認為最好的方法是放棄 /* 符號而只使用

rsync -r --exclude="node_modules" "/r2g_shared_dir/vamoot" "/home/node/.docker_r2g_cache/b640e7fd-27a7-4dd8-8ca8-5363a1c59c35"

但還有其他方法嗎?

最好將模式匹配保留給 rsync,這樣您就不必依賴當時 shell 的任何 shell 和選項。

當你這樣做時:

rsync -a /some/dir/* host:/remote/dir/

那麼您實際上是在要求 shell 擴展該/some/dir/*部分,以便 rsync 實際上像這樣執行:

rsync -a /some/dir/adir /some/dir/afile /some/dir/anotherfile [etc] host:/remote/dir/

這通常與意圖非常相似,但並不總是如提出這個問題的事實所證明的那樣。因此最好執行:

rsync -a /some/dir/ host:/remote/dir/

現在 rsync 將(因為它-a是遞歸的簡寫)遞歸遍歷目錄並將其所有內容同步到遠端主機上,包括直接在.-rlptgoD``-r``/some/dir``/remote/dir``/some/dir

由於源路徑以斜杠結尾/,因此傳輸的文件名會省略源位置的任何部分。如果/some/dir通過了,那麼您就是要明確同步dir目錄,包括其名稱。建議養成始終添加最後一個斜杠的習慣以避免這種混淆,除非您真的了解發生了什麼。

我認為最好的方法是使用存檔模式 (-a),手冊頁對此進行了說明:“這相當於 -rlptgoD。這是一種快速表示您想要遞歸併想要保留幾乎所有內容的方式(其中 -H 是明顯的遺漏)。”:

rsync -a /source/path/ /destination/path/
  • 始終使用結束斜杠 /
  • 不要使用 * 因為它不包括點文件
  • 如果通過比磁碟讀/寫慢的網路傳輸,請考慮壓縮 -z

引用自:https://unix.stackexchange.com/questions/446348