假设我有一个目录/home/smit/test
。里面有许多子目录和文件。我只想删除目录/home/smit/test
而不删除其内部内容,这样文件和子目录/home/smit/test
就会自动包含在内/home/smit/
?
另外,在实际情况下,我有一个/usr/share/backgrounds/all/
包含许多子目录的目录。这些子目录中有很多图像。我想删除所有子目录,以便将其内容包含在内/usr/share/backgrounds/all/
。我可以使用 GUI 执行此操作,但我想通过终端以更酷的方式执行此操作。我该怎么做?
答案1
在这些情况下,同名文件可能会被覆盖。正如 @Arronical 所说,您可以使用标志来避免这种情况,该标志-b
会mv
通过在名称后附加内容来区分所有同名文件~
。但是,如果有三个或更多同名文件,则只会保存第一个和最后一个文件,因此请在移动之前检查内容以保护您的文件。
第一种简单情况很容易;我们可以使用 shell glob。但是,这不会移动隐藏文件,因此,如果您有任何以 开头的文件名.
,请先打开dotglob
shopt -s dotglob
然后你可以运行:
mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test
如果愿意,可以关闭dotglob
(打开新 shell 时它将恢复为默认值):
shopt -u dotglob
对于第二种(真实)情况,我们将使用find
,它默认移动隐藏文件:
首先请确保您位于正确的位置。
cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;
如果看起来不错,则运行它而不echo
实际移动文件
find -type f -exec mv -vb -- {} . \;
然后找到目录
find -type d
如果您看到想要删除的内容:
find -type d -delete
这是安全的,因为它会拒绝删除仍有内容的目录。