我想知道如何複製文件而不覆蓋舊文件,我沒有-n開關可用。BASH:如何在不覆蓋舊文件的情況下複製文件
就我所知,cp -u和rsync都會覆蓋較舊的文件,而且我不想要這種行爲,我希望始終保留較舊的文件。
感謝
我想知道如何複製文件而不覆蓋舊文件,我沒有-n開關可用。BASH:如何在不覆蓋舊文件的情況下複製文件
就我所知,cp -u和rsync都會覆蓋較舊的文件,而且我不想要這種行爲,我希望始終保留較舊的文件。
感謝
您可以使用「--interactive
」選項(存在於我的cp
從GNU coreutils 6.12
)覆蓋前提示您,並用默認的填充:
echo 'n' | cp --interactive ~/somefile.txt ~/somefile_already_exists.txt
這是一個非交互式做法。它檢查文件是否存在(在初始附加一個隨機數之後)。如果確實如此,它會尋找另一個隨機數。這可以通過不同的方式進行修改。可以添加參數,等等。
copyfile() {
n=$RANDOM
while [ -f $1__$n ]
do
n=$RANDOM
done
cp $1 $1__$n
}
用法:
copyfile file_to_copy
您的文件將被命名爲財產以後這樣的:
Originalfile.txt_20625
所附的數字最有可能阻止覆蓋的機會。如果這還不夠,那麼可以添加任何他們希望到文件末尾的東西,比如時間戳。如果你仍然擔心這些措施後覆蓋,那麼你可能應該定期備份你的文件。
刪除字符?吉姆並不想刪除,而是複製。 – dougEfresh
爲什麼downvotes?這確實複製了一個文件。這個網站很荒謬。 –
@BobBlogge,你仔細閱讀過這個問題嗎?如果'file_copy'已經存在,使用你的例子它將被覆蓋。 –
將文件複製到同一目錄中新創建的臨時文件(請參閱在Linux下的mktemp
或tempfile
)。然後使用ln
試圖給出您想要的名稱的副本。如果名稱存在,則ln
將失敗;你可以嘗試使用不同的名稱,或只是發出錯誤信息,或其他。最後,刪除臨時名稱。
對不起,我希望避免複製文件(很大),謝謝。 –
@JimMoyle:然後在執行上述操作之前測試文件是否存在。偶爾,你會得到一個毫無意義的副本,但上面列出的原子副本至少會阻止數據競爭。 – rici
如果它是一個選項,你可以寫一個腳本來做到這一點。這是我首選的做事方法。通過這種方式,我可以對行爲進行100%的定製 –
您是否有可用的-b選項? – dougEfresh
@RussellUhl,在編寫腳本時要小心TOCTOU的風險。 –