我試圖模仿Unix命令通過使用Perl是否在Perl符號鏈接功能覆蓋現有的鏈接
symlink (/path/to/file /path/to/link)
還包括Perl刪除現有目標文件
ln -sf /path/to/file /path/to/link
,並創建類似符號鏈接-s -f選項?
我試圖模仿Unix命令通過使用Perl是否在Perl符號鏈接功能覆蓋現有的鏈接
symlink (/path/to/file /path/to/link)
還包括Perl刪除現有目標文件
ln -sf /path/to/file /path/to/link
,並創建類似符號鏈接-s -f選項?
symlink
只是簡單地調用相同名稱的OS調用(symlink(2)
),當「newpath
已存在」時返回錯誤EEXIST
。
如果你想實現-f
,你可以使用
unlink($new_qfn);
symlink($old_qfn, $new_qfn)
or die("Can't create symlink \"$new_qfn\": $!\n");
但是,下列情況處理競爭條件更好的工作:
if (!symlink($old_qfn, $new_qfn)) {
if ($!{EEXIST}) {
unlink($new_qfn)
or die("Can't remove \"$new_qfn\": $!\n");
symlink($old_qfn, $new_qfn)
or die("Can't create symlink \"$new_qfn\": $!\n");
} else {
die("Can't create symlink \"$new_qfn\": $!\n");
}
}
ln
採用後一種方法。
$ strace ln -sf a b
...
symlink("a", "b") = -1 EEXIST (File exists)
unlink("b") = 0
symlink("a", "b") = 0
...
這很容易弄清楚你自己。讓我們來試試
ls -li link_to_FILE.txt
# 2415940160 lrwxrwxrwx. ... link_to_FILE.txt -> FILE.txt
與
perl -wE'symlink "FILE.txt", "link_to_FILE.txt" or warn "Cant make it: $!"'
它打印
Cant make it: File exists at -e line 1.
,我檢查原始文件(鏈接)具有相同的inode編號仍然存在。
所以,不,它不會覆蓋現有的文件。
symlink的頁面表示沒有選項f orce那。
這是一個很好的答案。謝謝! – pmsuresh