Cp

GNU cp 和 mv 中 -T 選項的附加值是什麼?

  • June 10, 2016

為什麼某些 GNU Coreutils 命令有-T/--no-target-directory選項?似乎它所做的一切都可以使用.傳統 Unix 目錄層次結構中的 (self dot) 的語義來實現。

考慮:

cp -rT /this/source dir

-T選項可防止副本創建dir/source子目錄。而是/this/source被標識為,dir並且內容相應地在樹之間映射。所以例如/this/source/foo.cdir/foo.c等等,而不是去dir/source/foo.c

但這可以很容易地完成,而無需-T使用以下選項:

cp -r /this/source/. dir  # Probably worked fine since dawn of Unix?

從語義上講,尾隨點組件被複製為 的子項dir,但當然“子項”已經存在(因此不必創建)並且實際上是dir其本身,因此效果是/this/pathdir.

如果目前目錄是目標,它可以正常工作:

cp -r /this/tree/node/. . # node's children go to current dir

有沒有什麼你可以做的事情才能-T使它的存在合理化?(除了支持不實現點目錄的作業系統之外,文件中沒有提到一個基本原理。)

上面的點技巧是否不能解決 GNU 資訊文件中提到的相同競爭條件-T

您的.技巧只能在您複製目錄而不是文件時使用。該-T選項適用於目錄和文件。如果你這樣做:

cp srcfile destfile

並且已經有一個名為destfile它將復製到的目錄destfile/srcfile,這可能不是預期的。所以你用

cp -T srcfile destfile

你正確地得到了錯誤:

cp: cannot overwrite directory `destfile' with non-directory

如果您嘗試使用該.方法,則副本將永遠無法工作:

cp: cannot stat `srcfile/.`: Not a directory

cp//最初設計的問題在於它們是兩個命令合二為一(mv複製復製到)。ln

cp A B

A 複製到 B將 A 複製到 B將 A 複製到 B/A),具體取決於是否B存在並且是目錄(如果 B 是目錄的符號連結,則有更多變體)。

這很糟糕,因為它是模棱兩可的。所以 GNU 實現增加了解決這個問題的選項。

cp -T A B

無論如何都將 A 複製到 B。如果B存在並且是一個目錄,那將失敗(除非你通過-r)。無論如何,當您打算將文件複製B時,您最終不會得到一個A文件。B``A

和:

cp -t B A

複製到.

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