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