我有一個目錄名稱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
在這種情況下,mkdir
和rm
命令可以滿足您的要求,並且可以很好地協同工作,因為rm -r
也會刪除目錄,因此後續命令mkdir
將建立該目錄。
1Unix 程式設計的藝術,埃里克·S·雷蒙德,自己引用了道格·麥克羅伊的話。
答案3
刪除目錄的命令是rm
.所以你需要2個指令。
rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/
如評論中所示,您可以將它們連結起來 ;
(=即使第一個失敗也執行這兩個操作)或&&
(=當 rm 未失敗時僅 mkdir)。
用於-r
刪除目錄。第一個指令也會刪除該目錄的所有內容。如果這不是您的意圖,那麼 rm 和 mkdir 都不是您正在尋找的:權限是chmod
和chown
。
為什麼 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>
這可確保您嘗試刪除的是目錄而不是檔案:
-d
檢查具有該名稱的目錄是否已存在。如果有,請將其刪除。-f
檢查是否不存在具有該名稱的檔案。如果是這樣,請列印錯誤訊息並退出。建立新目錄並回顯成功,如果失敗,則回顯失敗。