2013-07-12 108 views
1

我想知道如何複製文件而不覆蓋舊文件,我沒有-n開關可用。BASH:如何在不覆蓋舊文件的情況下複製文件

就我所知,cp -u和rsync都會覆蓋較舊的文件,而且我不想要這種行爲,我希望始終保留較舊的文件。

感謝

+0

如果它是一個選項,你可以寫一個腳本來做到這一點。這是我首選的做事方法。通過這種方式,我可以對行爲進行100%的定製 –

+0

您是否有可用的-b選項? – dougEfresh

+0

@RussellUhl,在編寫腳本時要小心TOCTOU的風險。 –

回答

3

您可以使用「--interactive」選項(存在於我的cpGNU coreutils 6.12)覆蓋前提示您,並用默認的填充:

echo 'n' | cp --interactive ~/somefile.txt ~/somefile_already_exists.txt 
+0

這個問題陳述了「一個文件」,但你是對的:'是n'是一個更一般的解決方案。 –

+0

nono .. echo'n'在這裏確定+1。我的失敗 – hek2mgl

+0

請注意,即使您使用'cp -ir a/* b /'(多個問題)'echo'n'|'也可以。 (已經測試過)我會預期echo'n'會壓制第一個問題...將不得不調查這個 – hek2mgl

-3

這是一個非交互式做法。它檢查文件是否存在(在初始附加一個隨機數之後)。如果確實如此,它會尋找另一個隨機數。這可以通過不同的方式進行修改。可以添加參數,等等。

copyfile() { 
     n=$RANDOM 
     while [ -f $1__$n ]  
     do 
     n=$RANDOM 
     done 
     cp $1 $1__$n 
    } 

用法:

copyfile file_to_copy 

您的文件將被命名爲財產以後這樣的:

Originalfile.txt_20625

所附的數字最有可能阻止覆蓋的機會。如果這還不夠,那麼可以添加任何他們希望到文件末尾的東西,比如時間戳。如果你仍然擔心這些措施後覆蓋,那麼你可能應該定期備份你的文件。

+0

刪除字符?吉姆並不想刪除,而是複製。 – dougEfresh

+0

爲什麼downvotes?這確實複製了一個文件。這個網站很荒謬。 –

+1

@BobBlogge,你仔細閱讀過這個問題嗎?如果'file_copy'已經存在,使用你的例子它將被覆蓋。 –

1

將文件複製到同一目錄中新創建的臨時文件(請參閱在Linux下的mktemptempfile)。然後使用ln試圖給出您想要的名稱的副本。如果名稱存在,則ln將失敗;你可以嘗試使用不同的名稱,或只是發出錯誤信息,或其他。最後,刪除臨時名稱。

+0

對不起,我希望避免複製文件(很大),謝謝。 –

+0

@JimMoyle:然後在執行上述操作之前測試文件是否存在。偶爾,你會得到一個毫無意義的副本,但上面列出的原子副本至少會阻止數據競爭。 – rici

相關問題