Evs*_*ter 69 command-line shell directory wildcards rm
这个问题是我在这里发布的第一个问题的第二阶段
我有一个目录,其中包含一堆子目录、.zip 文件和子目录中未包含的其他随机文件。
我想要一个命令行脚本来从父目录中删除所有子目录,但保留所有 zip 文件和不属于任何子目录的松散文件。所有子目录都有内容,所以我相信我需要使用 -f 命令强制删除它们。
因此,基本上,一个查看父目录(或当前目录)内部的命令会删除其中的所有文件夹,但保留所有不是文件夹或包含在文件夹中的其他内容和文件。
我知道从命令行删除项目需要特别小心,但我已经采取了所有必要的预防措施来远程备份。
pet*_*rph 83
在 BASH 中,您可以使用尾部斜杠(我认为它应该适用于任何 POSIX shell):
rm -R -- */
Run Code Online (Sandbox Code Playgroud)
请注意--将选项与参数分开并允许删除以连字符开头的条目 - 否则在 shell 扩展后,条目名称将被解释为选项 by rm(对于许多其他命令行实用程序也是如此)。
-f如果您不想在删除不可写文件时提示确认,请添加该选项。
请注意,默认情况下,隐藏目录(名称以 开头的目录.)将被保留。
一个重要的警告:扩建*/还将包括符号链接,最终解析为类型的文件目录。并且根据rm实现,rm -R -- thelink/要么只删除符号链接,要么(在大多数情况下)递归删除链接目录的内容,但不删除该目录本身或符号链接。
如果使用zsh,更好的方法是使用glob 限定符仅选择目录类型的文件:
rm -R -- *(/) # or *(D/) to include hidden ones
Run Code Online (Sandbox Code Playgroud)
或者:
rm -R -- *(-/)
Run Code Online (Sandbox Code Playgroud)
包含指向目录的符号链接(但因为这一次,扩展没有尾随/s,它只是符号链接被所有rm实现删除)。
使用bash, AT&T ksh,yash或者zsh您可以执行以下操作:
set -- */
rm -R -- "${@%/}"
Run Code Online (Sandbox Code Playgroud)
去除尾随/.
der*_*ert 16
除了通配符方式,您还可以使用find(至少是 GNU find)来执行此操作:
find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -r0 rm -R
Run Code Online (Sandbox Code Playgroud)
与其他find行一样,您可以运行第一部分 ( find -mindepth 1 -maxdepth 1 -type d) 来查看将被删除的目录列表。
可移植地(POSIXly),您可以使用-exec cmd {} +语法而不是-print0 | xargs -r0,并-prune限制深度:
find . ! -name . -prune -type d -exec echo rm -R {} +
Run Code Online (Sandbox Code Playgroud)
(并删除echo实际执行它)。
一个更安全的选择(这里也假设 GNU mv)是做这样的事情:
find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -r0 rm -R
Run Code Online (Sandbox Code Playgroud)
其中任何一个都会将所有内容移入../to-rm而不是删除它。你可以验证它做了你想要的,rm -Rf在你空闲的时候他们那个目录。