如何删除目录而不删除其内容?

6 command-line rm directory

假设我有一个目录/home/smit/test。在它里面我有很多子目录和文件。我只想删除目录/home/smit/test 而不是其内部内容,以便 的文件和子目录/home/smit/test将自动包含在/home/smit/?

另外,在实际情况下,我有/usr/share/backgrounds/all/一个包含许多子目录的目录。这些子目录有很多图像。我想删除所有子目录,以便它们的内容将包含在/usr/share/backgrounds/all/. 我可以用 GUI 来做到这一点,但我想通过终端用很酷的方式来做到这一点。我该怎么做?

Zan*_*nna 15

在这些情况下,存在覆盖同名文件的风险。正如@Arronical 所提到的,您可以使用-b标志来避免这种情况,该标志mv会通过附加~到名称来区分任何同名文件。但是,如果有三个或更多同名文件,则只会保存第一个和最后一个,因此请在移动前检查内容以保护您的文件。

第一个,简单的情况很容易;我们可以使用 shell glob。但是,这不会移动隐藏文件,因此如果您有任何以 开头的文件名.,请先打开dotglob

shopt -s dotglob
Run Code Online (Sandbox Code Playgroud)

然后你可以运行:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test
Run Code Online (Sandbox Code Playgroud)

dotglob如果您愿意,请关闭(当您打开新外壳时,它无论如何都会恢复为默认值):

shopt -u dotglob
Run Code Online (Sandbox Code Playgroud)

对于第二种(真实)情况,我们将使用find,它默认移动隐藏文件:

首先确保您位于正确的位置。

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;
Run Code Online (Sandbox Code Playgroud)

如果这看起来不错,运行它而不echo实际移动文件

find -type f -exec mv -vb -- {} . \;
Run Code Online (Sandbox Code Playgroud)

然后找到目录

find -type d
Run Code Online (Sandbox Code Playgroud)

如果您看到要删除的内容:

find -type d -delete
Run Code Online (Sandbox Code Playgroud)

这是安全的,因为它会拒绝删除仍然有内容的目录。

  • 您还可以使用 `mv` 的 `-b` 或 `--backup` 选项来处理重复的文件名,并对原始版本进行备份。 (3认同)