GNU cp 和 mv 中 -T 選項的附加值是什麼?
為什麼某些 GNU Coreutils 命令有
-T/--no-target-directory
選項?似乎它所做的一切都可以使用.
傳統 Unix 目錄層次結構中的 (self dot) 的語義來實現。考慮:
cp -rT /this/source dir
該
-T
選項可防止副本創建dir/source
子目錄。而是/this/source
被標識為,dir
並且內容相應地在樹之間映射。所以例如/this/source/foo.c
去dir/foo.c
等等,而不是去dir/source/foo.c
。但這可以很容易地完成,而無需
-T
使用以下選項:cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
從語義上講,尾隨點組件被複製為 的子項
dir
,但當然“子項”已經存在(因此不必創建)並且實際上是dir
其本身,因此效果是/this/path
用dir
.如果目前目錄是目標,它可以正常工作:
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
是複製到.