我有一个目录的名称foo
位于~/Desktop
。假设我想从一个具有相同名称和相同位置的终端创建目录。当我尝试mkdir
它给了一个错误:
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
那是有道理的,但我想替换foo
是否存在。我浏览了一下,man mkdir
但是没有任何选择可以做到这一点。
那么如何覆盖foo
目录呢?
为什么没有mkdir
选择的办法?
我有一个目录的名称foo
位于~/Desktop
。假设我想从一个具有相同名称和相同位置的终端创建目录。当我尝试mkdir
它给了一个错误:
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
那是有道理的,但我想替换foo
是否存在。我浏览了一下,man mkdir
但是没有任何选择可以做到这一点。
那么如何覆盖foo
目录呢?
为什么没有mkdir
选择的办法?
Answers:
如果您的目标是执行以下一行命令:
~/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参考手册有关的更多信息和说明;
,&
,||
,和&&
运营商。
正如专家建议(和Rinzwind阐述)一样,我建议您调查一下rsync
它是否可以满足您的备份需求。rsync文档页面上还有一些其他有用的指南,以及此Ubuntu rsync指南。
为什么mkdir没有此选项?
mkdir
创建目录(“ mk” 代表“ make”)。因为它还会以递归方式删除目录,并且目录中的所有文件也将是不好的,因为它违反了最小惊讶原则,可能会导致数据丢失。
rmdir
甚至不删除其中包含任何(非目录)文件的目录。rm
有一个-r
选项,这是有道理的,因为rm
预期会删除文件(这是其目的,因此固有的危险是直观的,用户通常会在运行rm
命令时小心谨慎)。
删除目录的命令是rm
。因此,您需要2条命令。
rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/
如注释中所示,您可以使用 ;
(=即使第一个失败都执行两个操作)或&&
(= rm不失败时仅mkdir)链接它们。
的-r
是去除迪尔斯。第一个命令还将删除目录的所有内容。如果这不是您的意图,那么rm和mkdir都不是您想要的:权限是chmod
和chown
。
为什么mkdir没有此选项?
含糊不清。mkdir
表示make目录。不删除并建立目录。并且由于该rm
命令用于删除内容,因此无需rmdir
删除目录。
为此,我使用以下最干净的方法:
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
检查是否不存在任何使用该名称的文件。如果是这样,则打印错误消息并退出。
创建新目录并回显成功,如果失败,则回显失败。
foo
为删除所有内容吗?mkdir
有一个-p
选项可以忽略目录是否存在。