2024/05/22

Different copy behavior in rsync scp cp and mv

在 Linux 的環境內,我們常常會需要搬移目錄或檔案,不管是在內部或者是 remote,搬移的時候尾巴有沒有 / 這個符號在幾個常用跟搬移有關的指令實際行為有很大的差異,以下面的結構舉例。

src/first.txt
src/second/second.txt

dest/

src 是來源目錄,dest 是目標目錄。

cp

command result
cp -rv src dest/ dest/src/first.txt
dest/src/second/second.txt
cp -rv src/ dest/ dest/src/first.txt
dest/src/second/second.txt
cp -rv src/* dest/ dest/first.txt
dest/second/second.txt

cp 這個指令不會隨 / 有所影響,要不要 src 這層取決於你有沒有指定他以下的內容進行複製。

scp

command result
scp -r src dest/ dest/src/first.txt
dest/src/second/second.txt
scp -r src/ dest/ dest/src/first.txt
dest/src/second/second.txt
scp -r src/* dest/ dest/first.txt
dest/second/second.txt

scp 的複製行為跟 cp 是一模一樣的。

rsync

command result
rsync -rv src dest/ dest/src/first.txt
dest/src/second/second.txt
rsync -rv src/ dest/ dest/first.txt
dest/second/second.txt
rsync -rv src/* dest/ dest/first.txt
dest/second/second.txt

rsync 是會受到 src 後方有沒有 / 影響結果的。

mv

command result
mv src dest/ dest/src/first.txt
dest/src/second/second.txt
mv src/ dest/ dest/src/first.txt
dest/src/second/second.txt
mv src/* dest/ dest/first.txt
dest/second/second.txt

總結來講,cpscpmv 這三個搬運的行為是一致的,會有不同影響的只有 rsync,所以使用 rsync 時要比較注意一點,也可以說你要不包含目錄的話,四個指令就都加 /*,要包含的話就尾巴不要 /,這樣比較好記。