覆盖现有目录吗?

覆盖现有目录吗?

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

在这种情况下,mkdirrm命令将执行您需要的操作,并且可以很好地协同工作,因为rm -r也会删除目录,因此后续命令mkdir将创建目录。

1Unix 编程艺术,Eric S. Raymond,本身就引用了Doug McIlroy 的话。

答案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. 创建新目录并回显成功,如果失败则回显失败。

相关内容