覆蓋現有目錄?

覆蓋現有目錄?

我有一個目錄名稱foo位於~/Desktop.假設我想從終端建立一個具有相同名稱和位置的目錄。當我嘗試時,mkdir它給出了一個錯誤:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

這是有道理的,但我想替換foo如果存在的話。我翻閱了man mkdir但沒有任何選項可以做到這一點。

那麼如何覆蓋foo目錄呢?

為什麼沒有mkdir選項來執行此操作?

答案1

如果您的目標是執行一行命令:

  • ~/Desktop/foo如果目錄已存在,則刪除並重新建立該目錄。
  • ~/Desktop/foo如果目錄尚不存在,則僅建立該目錄。

然後你可以使用:

rm -r ~/Desktop/foo; mkdir ~/Desktop/foo

;相當於換行符,但它允許您在一行上執行多個命令(即作為“單一命令”)。

  • 如果您要刪除的目錄可能包含唯讀文件,您將需要該-f標誌來刪除它們,而不以互動方式提示使用者。沒關係,但我建議要特別小心rm -rf ...。看man rm了解詳情。
  • 你需要rm命令結束mkdir在命令執行之前;這就是使用;而不是 的原因&。 (前面的命令&在後台非同步運行。)
  • 當命令成功時需要mkdir運行該命令;rm這就是使用;而不是 的原因||
  • 當命令失敗時,您需要mkdir執行該命令rm(通常失敗表示該目錄尚不存在);這就是使用;而不是 的原因&&
  • rm即使目錄已經存在,該mkdir命令也可能會失敗,在這種情況下該命令也會失敗,但錯誤訊息是有意義的,並且可能不需要foo在嘗試建立目錄之前添加中間步驟來檢查是否存在。

3.2.3 指令列表在裡面Bash 參考手冊有關;&||&&運算符的更多資訊和解釋。

作為穆魯建議(和林茲溫德闡述),我建議你看看rsync看看它是否能滿足您的備份需求。還有一些其他有用的指南rsync 文件頁面, 也這個 Ubuntu rsync 指南

為什麼 mkdir 沒有這個選項?

mkdir建立目錄(“mk”代表“製作”)。對它來說,遞歸地刪除目錄及其中的所有檔案也是不好的,因為它會違反最小驚訝原則以可能導致資料遺失的方式。

rmdir甚至不刪除其中包含任何(非目錄)檔案的目錄。rm有一個-r選項,這是有道理的,因為rm預計會刪除檔案(這就是其目的,因此固有的危險是直觀的,用戶通常知道在運行rm命令時要小心)。

答案2

不,沒有一個命令可以執行您所要求的操作。

為什麼?

這就是 Unix 哲學:編寫只做一件事並把它做好的程式。編寫程式以協同工作。1

在這種情況下,mkdirrm命令可以滿足您的要求,並且可以很好地協同工作,因為rm -r也會刪除目錄,因此後續命令mkdir將建立該目錄。

1Unix 程式設計的藝術,埃里克·S·雷蒙德,自己引用了道格·麥克羅伊的話。

答案3

刪除目錄的命令是rm.所以你需要2個指令。

rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/

如評論中所示,您可以將它們連結起來 ;(=即使第一個失敗也執行這兩個操作)或&&(=當 rm 未失敗時僅 mkdir)。

用於-r刪除目錄。第一個指令也會刪除該目錄的所有內容。如果這不是您的意圖,那麼 rm 和 mkdir 都不是您正在尋找的:權限是chmodchown

為什麼 mkdir 沒有這個選項?

含糊不清。mkdir意思是建立目錄。不刪除並建立目錄。由於該rm命令用於刪除內容,因此不需要能夠rmdir刪除目錄。

答案4

為了以最乾淨的方式做到這一點,我使用這個:

create_clean_directory(){
    dir_name=$1
    if [ -d "$dir_name" ]; then
        echo "Removing $dir_name"
        rm -rf "$dir_name"
    elif [ -f "$dir_name" ]; then
        echo "File with this name already exists, not a directory."
        exit
    fi
    if mkdir "$dir_name"; then
        echo "Clean directory created: $dir_name"
        return 0
    else
        echo "Creating directory failed: $dir_name"
        return 1
    fi 
}

並使用它:

create_clean_directory <dir_name>

這可確保您嘗試刪除的是目錄而不是檔案:

  1. -d檢查具有該名稱的目錄是否已存在。如果有,請將其刪除。

  2. -f檢查是否不存在具有該名稱的檔案。如果是這樣,請列印錯誤訊息並退出。

  3. 建立新目錄並回顯成功,如果失敗,則回顯失敗。

相關內容