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 参考手册有关;
、&
、||
和&&
运算符的更多信息和解释。
作为muru建议(和Rinzwind 详细说明),我确实建议你看看rsync
看看它是否能满足您的备份需求。rsync 文档页面, 也本 Ubuntu rsync 指南。
为什么 mkdir 没有这个选项?
mkdir
创建目录(“mk”代表“make”)。对于它来说,递归删除目录和其中的所有文件也是不好的,因为这违反了最小惊讶原则可能会导致数据丢失。
rmdir
甚至不会删除包含任何(非目录)文件的目录。rm
有一个-r
选项,这是有意义的,因为rm
预计会删除文件(这是它的目的,因此固有的危险是直观的,用户通常知道在运行rm
命令时要小心)。
答案2
不,没有单一命令可以完成您所要求的操作。
为什么?
这是 Unix 哲学:编写只做一件事的程序,并做好它。编写程序以协同工作。1
在这种情况下,mkdir
和rm
命令将执行您需要的操作,并且可以很好地协同工作,因为rm -r
也会删除目录,因此后续命令mkdir
将创建目录。
1Unix 编程艺术,Eric S. Raymond,本身就引用了Doug McIlroy 的话。
答案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
检查不存在该名称的文件。如果存在,则打印错误消息并退出。创建新目录并回显成功,如果失败则回显失败。