这个问题是我发布的第一个问题的第二阶段这里
我有一个目录,其中包含一堆子目录、.zip 文件以及子目录中未包含的其他随机文件。
我想要一个命令行脚本来删除父目录中的所有子目录,但保留所有 zip 文件和不属于任何子目录的松散文件。所有子目录都有内容,所以我相信我需要使用 -f 命令强制删除它们。
因此,基本上,查看父目录(或当前目录)内部的命令会删除其中的所有文件夹,但保留不是文件夹或包含在文件夹中的所有其他内容和文件。
我知道从命令行删除项目需要特别小心,但我已经采取了所有必要的预防措施来进行远程备份。
答案1
在 BASH 中,您可以使用尾部斜杠(I思考它应该可以在任何 POSIX shell 中工作):
rm -R -- */
请注意,--
它将选项与参数分开,并允许删除以连字符开头的条目 - 否则在 shell 扩展后,条目名称将被解释为选项rm
(对于许多其他命令行实用程序也是如此)。
-f
如果您不想在删除不可写文件时提示确认,请添加该选项。
请注意,默认情况下,隐藏目录(名称以 开头的目录.
)将被保留。
一个重要的警告: 的扩展*/
还将包括最终解析为文件类型的符号链接目录。根据rm
实现的不同,rm -R -- thelink/
要么只删除符号链接,要么(在大多数情况下)删除内容递归地访问链接目录,但不访问该目录本身或符号链接。
如果使用zsh
,更好的方法是使用全局限定符仅选择目录类型的文件:
rm -R -- *(/) # or *(D/) to include hidden ones
或者:
rm -R -- *(-/)
包含到目录的符号链接(但是因为这次扩展没有尾随/
s,所以所有实现中仅删除了符号链接rm
)。
通过bash
、 AT&Tksh
或您可以执行以下操作yash
:zsh
set -- */
rm -R -- "${@%/}"
去除尾随的/
.
答案2
除了通配符方式之外,你还可以使用find
(至少是GNU find)来做到这一点:
find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -r0 rm -R
与其他find
行一样,您可以运行第一部分 ( find -mindepth 1 -maxdepth 1 -type d
) 以查看将删除的目录列表。
可移植地(POSIXly),您可以使用-exec cmd {} +
语法而不是-print0 | xargs -r0
, 并-prune
限制深度:
find . ! -name . -prune -type d -exec echo rm -R {} +
(并删除echo
以实际执行)。
一个更安全的选择(这里也假设 GNU mv
)是这样做:
find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -r0 mv -i -t ../to-rm
# or (but beware of symlinks!)
mv -i -t ../to-rm -- */
# or
mv -i -- */ ../to-rm
其中任何一个都会将所有内容移入../to-rm
而不是删除它。您可以rm -Rf
在闲暇时验证它是否执行了您想要的操作。
答案3
您可能需要为其中一些建议(尤其是 )创建一个脚本,rm -R -- */
并将其保存在 /usr/local/bin 文件夹中;或者alias
在 ~/.bashrc 文件中创建一个。既然是所以很容易错误输入命令并破坏您的系统 - 即使是单个字母和/或字母顺序也可能导致灾难性后果 - 这将是一个比每次输入不同选项和参数更可靠的解决方案想要完成这个任务。
此外,您可能希望在脚本/命令中包含-i or --interactive=once
或-I or --interactive=always
选项,它将作为另一个工具来避免意外删除。
此外,类似的东西德罗伯特建议会是最好的;只需将脚本复制/粘贴到文件/终端编辑器中,然后根据您的具体需要进行调整,文件/目录将被移动到一个目录中(您可以检查/验证其中的内容),您可以通过以下方式简单地删除该目录:发出rm -rf
命令。
另一种选择是使用 GUI 应用程序,例如文件管理器,然后只需选择要删除的所有适用文件/文件夹。如果您没有权限,请检查您的发行版的手册页。
最后,如果文件夹为空(本质上是简单的文件名),您可以使用该rmdir
命令删除它们。它并不适用于您可能想要删除的所有内容,但有时当您想做一些“清理工作”时它会派上用场。 **您可能想尝试该-p --ignore-fail-on-non-empty
选项,该选项允许您删除某些子目录及其空的“父目录”——它们所在的目录。
答案4
如果您还想删除主目录。尝试以下命令:
rm -rf <directory name>
如果您想保持父目录不变但删除其所有内容:
enter code here