Cp

cp 在 .(dot) 或 .. (dot dot) 是源目錄

  • July 13, 2020

這個答案表明,可以將所有文件(包括隱藏文件)從目錄複製src到目錄中dest,如下所示:

mkdir dest
cp -r src/. dest

答案或其評論中沒有解釋為什麼這實際上有效,而且似乎也沒有人找到這方面的文件。

我嘗試了一些東西。一、正常情況:

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file  src

然後,/.最後:

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file  .dotfile  src_dir  src_file

因此,它的行為類似於*,但也會複製隱藏文件。

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file  src_dir  src_file

.並且是此處解釋..的正確硬連結,就像目錄條目本身一樣。

這種行為是從哪裡來的,它記錄在哪裡?

該行為是記錄在案的算法的邏輯結果cp -R。參見POSIX,步驟 2f:

將source_file目錄中的文件複製到dest_file目錄,執行此處列出的四個步驟(1 到 4),文件為source_files

...是目錄,分別是目前目錄和父目錄。就外殼而言,兩者都不是特殊的,因此擴展也不關心,並且目錄將被複製,包括隱藏文件。*,另一方面,將擴展為文件列表,這是隱藏文件被過濾掉的地方。

src/.是裡面的目前目錄src,也就是src它本身;src/src_dir/..src_dir的父目錄,又是src. 所以從外面看src,如果src是一個目錄,指定src/.src/src_dir/..作為源文件cp是等價的,並且複制其中的內容src,包括隱藏文件。

指定的要點src/.是,如果src不是目錄(或目錄的符號連結),它將失敗,而src不會。它也只會複製的內容src,而不複製src自己;這也符合文件:

如果target存在並命名現有目錄,則文件層次結構中每個文件的相應目標路徑的名稱應為 target 的串聯,如果target 沒有以斜杠結尾,則為單個斜杠字元,以及文件相對路徑名到包含source_file的目錄。

所以cp -R src/. dest複製srcto的內容dest/.(源文件.src),而cp -R src dest複製srcto的內容dest/src(源文件在src)。

另一種思考方式是比較複製src/src_dirand src/.,而不是比較src/.and src.行為就像src_dir前一種情況一樣。

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