AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1651882
Accepted
maja
maja
Asked: 2021-05-28 01:20:22 +0800 CST2021-05-28 01:20:22 +0800 CST 2021-05-28 01:20:22 +0800 CST

删除具有给定名称的目录的所有内容,使目录保持不变

  • 772

考虑到这个关于按名称删除文件夹的问题的答案以及关于在路径树中的第一个正数处停止搜索的问题的答案,我如何删除目录的所有内容,包括子目录和文件,同时保持目录完整并停止在路径树的第一场比赛中?

换句话说,我可能有:

./path/to/foo/again/foo

使用包含 bar.txt 文件的 ./path/to/foo 文件夹,我希望获得:

./path/to/foo

不包含文件或目录。

linux command-line
  • 1 1 个回答
  • 53 Views

1 个回答

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2021-05-28T03:17:23+08:002021-05-28T03:17:23+08:00

    请注意第二个链接(“关于在路径树中的第一个正数处停止搜索”)并不真正相关,因为忽略它的解决方案可能为空./path/to/foo/again/foo然后为空./path/to/foo;或者它可能首先是空的./path/to/foo并且根本没有到达./path/to/foo/again/foo(因为这个路径现在不存在)。在任何情况下,目标都会达到。

    (some) 下的任何内容都foo匹配-path '*/foo/*',但./path/to/foo本身不匹配。find不会在它创建和检查的路径中添加尾部斜杠。一个例外是类似于find /path/to/foo/ …where /path/to/foo/will be processes with a trailing slash and it will match -path '*/foo/*'。您可能会考虑-path '*/foo/?*',但如果您从/path/to/foo//(这是一个有效的路径名)开始,那么它将匹配。

    所以也许-path 和 -name?

    find . -path '*/foo/*' ! -name foo
    

    它会给你一个很好的删除路径名列表吗?注意./path/to/foo/again/foo不会在上面。该列表将包含./path/to/foo/again,因此如果您again正确删除,那么./path/to/foo/again/foo无论如何都会被删除。不错,直到您意识到列表中没有允许您删除的条目./path/to/foo/foo/foo(如果存在这样的路径)。

    另一个问题-path '*/foo/*'是当您以/a/foo/starting/point. 在这种情况下,考虑的每条路径find都将匹配。实际上,您可能无意中删除了整个point,而您的意图是清空/a/foo/starting/point/whatever/foo/。

    如果可以cd到起点,那么这应该是安全的:

    cd /whatever/the/starting/point
    # check if cd succeeded (the check can be automated with cd … && find … )
    find . -path '*/foo/?*' -delete
    

    (?很可能不需要,因为规范明确指出,相对于我们作为起始路径提供的路径名部分中不应有斜杠;但我不知道是否所有的实现都find严格遵守;所以?以防万一)。

    即使foo出现在 的路径中starting/point,也没关系。find测试的是工具构建的路径名,而-path不是实际的绝对路径名。当 find.从那时开始时,它构建的所有路径名都将以字符串开头.并将-path它们作为字符串进行测试。

    注意-delete不可移植。便携式解决方案可能是以下之一:

    find . -depth -path '*/foo/?*' -exec rm -r {}  +
    find .        -path '*/foo/?*' -exec rm -r {} \;
    

    第一个的工作方式类似于-delete(这意味着-depth):它仅在处理完目录的所有内容后才处理目录。rm将以正确的顺序一一获取路径名,并且它实际上不需要递归工作,因为它尝试删除的任何目录都应该已经是空的(仍然-r需要它才能删除目录)。多个路径名将被提供给一个,rm多亏了+,仍然可能会有多个,rm因为您不能rm使用任意多个参数运行。find -exec … +知道这一点并且可以执行尽可能多的命令(rm在我们的例子中是进程),因为它需要处理任意多的条目并且不达到限制(为了比较:xargs也知道这一点)。

    在许多情况下,最佳的可移植解决方案是运行一个或几个rm -r进程来删除非目录和直接在 下的目录./path/to/foo/,因此find甚至不需要更深入。这就是第二个命令的作用。请注意,有;(从外壳中逃脱)而不是+. 我们不希望+,因为它可能会find决定 的内容./path/to/foo/还不足以运行rm许多参数,它会更深入地添加更多参数,找到 的内容./path/to/foo/again/foo/,然后才开始rm。所以rm -r得到./path/to/foo/again和(可能在其他中)./path/to/foo/again/foo/whatever,它(递归地)删除前者,然后抱怨后者不存在。因此,如果没有-depth,最好运行一个rm每个路径名,所以-exec … \;.

    但即便如此,不再存在的文件也可能会触发警告;不是来自,rm而是来自find。这是因为find在处理目录之前了解目录的内容。即使它要先处理目录(即即使没有-depth),它也会这样做。rm删除后./path/to/foo/again find仍会尝试处理./path/to/foo/again/whatever。任何具有(显式或隐含)-depth的解决方案都不会出现此问题。

    使用第一个可移植形式,带有-depth; 或更好的形式与-delete,如果只有你的find支持-delete。


    旁注:如果你想清空一个特定的目录然后cd到它并且:

    # check if in the right directory
    find . ! -name . -delete
    

    find您甚至不需要常见的实现,! -name .因为它们不会删除.,而且是设计使然。该命令简化为:

    find . -delete
    
    • 1

相关问题

  • Python 的“pass”参数的批处理等价物是什么?

  • 禁用后无法启用 Microsoft Print to PDF

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve