覆盖现有目录?


11

我有一个目录的名称foo位于~/Desktop。假设我想从一个具有相同名称和相同位置的终端创建目录。当我尝试mkdir它给了一个错误:

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

那是有道理的,但我想替换foo是否存在。我浏览了一下,man mkdir但是没有任何选择可以做到这一点。

那么如何覆盖foo目录呢?

为什么没有mkdir选择的办法?


替换foo为删除所有内容吗?mkdir有一个-p选项可以忽略目录是否存在。
muru

4
因此,您是否需要一个命令,当您意外创建具有相同名称的新目录时,该命令将删除目录中的所有文件?您想知道为什么它没有任何选择吗?你在开玩笑吗?
马蒂·弗里德

downvoters只是澄清了为什么,我问一个删除现有目录的命令
nux 2014年

1
@nux对我来说,这个问题毫无意义...解释为什么您要删除并重新创建目录。对于您需要对目录执行的所有操作,我们都有命令。mkdir不需要选项来删除/重新创建。
Rinzwind 2014年

1
如果在问一个逻辑问题,这是犯罪吗!
nux

Answers:


21

如果您的目标是执行以下一行命令:

  • 删除并重新创建目录(~/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命令时小心谨慎)。


+1好。这个答案超出了解释语法的范围,我希望在stackexchange网站上有更深刻的理解。这个答案有很多金块。
Govind Rai'1

7

不,没有单个命令可以执行您要的操作。

为什么?

这是Unix的哲学:编写可以做一件事并且做得很好的程序。编写程序以协同工作。1个

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

1 Unix编程的艺术,埃里克·雷蒙德(Eric S. Raymond),自己引述道格·麦克罗伊(Doug McIlroy)。


目前,这是一个不错的答案,我将寻找它
2014年

3

删除目录的命令是rm。因此,您需要2条命令。

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

如注释中所示,您可以使用 ;(=即使第一个失败都执行两个操作)或&&(= rm不失败时仅mkdir)链接它们。

-r是去除迪尔斯。第一个命令还将删除目录的所有内容。如果这不是您的意图,那么rm和mkdir都不是您想要的:权限是chmodchown

为什么mkdir没有此选项?

含糊不清。mkdir表示make目录。不删除并建立目录。并且由于该rm命令用于删除内容,因此无需rmdir删除目录。


我知道,但是我的意思是一个命令,您可以查看我的编辑内容并进行更改
nux

第一个解释为什么您需要重新创建目录。这对我来说毫无意义。
Rinzwind 2014年

我的需求是否合理,我只是想知道如何?它让我感觉:)
马钱

@nux不,它不是。mkdir的维护者也不明白为什么;)您想要的东西是没有用的,没有价值。
Rinzwind 2014年

好的,如果您想知道要制作一个脚本来在具有foo相同名称的新目录中进行备份,并允许替换它(如果存在的话)以减少空间
nux 2014年

1

为此,我使用以下最干净的方法:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.