假设我有一个目录/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)
这是安全的,因为它会拒绝删除仍然有内容的目录。