題 讓文件出現在多個文件夾中


我有50多個文件夾,每個文件夾都包含大量需要處理的數據。所有這些都使用完全相同的代碼進行處理,利用os.path.dirname(os.path.realpath(文件))獲取python腳本所在的目錄,這樣用戶無需手動編輯,只需雙擊即可。

我需要腳本看起來在每個文件夾中,而實際上只在一個位置,所以我可以編輯一次,然後當從任何這些位置運行時,文件夾路徑是正確的。另一種方法是編輯主服務器,然後在我更新代碼的任何時候通過所有50多個文件夾一次粘貼一個文件夾,這非常非常繁瑣且容易出錯。在Linux上,我可以用符號鏈接設置它,但我無法找到在Windows上執行此操作的方法。

或者,一種將文件一次粘貼到所有目標目錄而不是一次粘貼一個目標的方法將實現相同的目標。


4
2018-02-17 22:02


起源


回答 堆棧溢出。看到 什麼是相當於這個unix符號鏈接命令的窗口? - DavidPostill♦
如果你想在Windows上進行符號鏈接的shell擴展(右擊菜單選項),我強烈建議 schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html。比cmd中的笨拙更容易交互使用。 - senshin
你真的有必要躺著這麼多副本嗎?從它的位置運行腳本是不是可能和更清潔? - Archimedix
您是否可以在每個包含主目錄中的Python腳本的目錄中創建單個文件? - Hayko Koryun


答案:


您需要一個符號鏈接或一個硬鏈接。

符號鏈接 (或簡稱符號鏈接)與快捷方式非常相似:有一個實際文件和多個引用(符號鏈接)。他們甚至還有那個小箭頭圖標。與快捷方式不同,符號鏈接可以包含任何擴展名。

硬鏈接 將硬盤驅動器上的文件綁定到目錄樹中的某個位置。每個文件至少有一個硬鏈接,否則它不會存在於任何目錄中。如果文件具有多個硬鏈接,則無法區分原始文件,並且文件僅在一個位置實際存在。

兩者都有其局限性:

  • 有些軟件與符號鏈接不兼容
  • 刪除原始文件會使其所有符號鏈接中斷
  • 你不能硬鏈接文件夾(但你可以創建一個 目錄連接 如果符號鏈接不夠)
  • 創建跨分區硬鏈接是不可能的

符號鏈接通常就足夠了。

要創建符號鏈接或硬鏈接:

  1. 啟動特權命令行:按 贏得,鍵入 cmd, 按 按Ctrl+轉移+輸入
  2. 問題 mklink 命令:

    • mklink link_name link_target 用於文件符號鏈接
    • mklink /d link_name link_target 用於文件夾符號鏈接
    • mklink /h link_name link_target 用於文件硬鏈接
    • mklink /j link_name link_target 用於目錄連接

13
2018-02-17 22:27



我也會指出這一點 硬鏈接需要額外的努力才能完全刪除。
“如果文件有多個硬鏈接,則原始文件無法區分” 為什麼? - Pacerier
@Pacerier因為它們都是相同的,除了路徑。這是一個文件和一個硬鏈接: (截圖)。符號鏈接顯示為 <SYMLINK> 在 dir 並且在資源管理器中有箭頭圖標,它們是一種特殊的文件類型。硬鏈接在任何方面都不是特別的。(圖) - gronostaj
來自Raymond Chen,The Old New Thing:“回想一下,硬鏈接為文件創建了一個替代名稱。一旦創建了該替代名稱,就無法確定哪個是原始名稱,哪個是新名稱。新文件沒有“鏈接回原始”;它們都是指向底層文件內容的鏈接。“ blogs.msdn.com/b/oldnewthing/archive/2011/07/20/10188033.aspx - user1008646
@ user1008646&gronostaj,但是不可能觀察到“創建”的時間戳來推斷出哪個文件可能是第一個? - Pacerier


在Win Vista和更新版本上,您可以創建sym鏈接或硬鏈接,其行為與您在Linux上的預期相同。您可以使用以下命令創建硬鏈接或sym鏈接 MKLINK 在Windows Visa和更新版本中構建的命令。 (使sym鏈接需要管理員權限。)

或者,對於您提到的替代方案,如果文件夾只是腳本所在文件夾的直接子文件夾,則可以在腳本文件夾的命令提示符中執行以下操作:

for /d %D in (*) do (copy /y "myscript.py" "%D")

一次更新它們。如果批量編寫此命令,則需要使用以下代碼:

for /d %%D in (*) do (copy /y "myscript.py" "%%D")

1
2018-02-17 22:31