我一直在寻找这个问题的答案,并使用过去找到的一些答案来查找和删除大量以某种模式命名的目录,例如所有名为“example”的目录,包括其所有内容(例如 /directory1/example/files、/directory2/subdirectory/example/files、/directory3/../../subdirectory/example/more/more/files),其中“example”目录下的所有内容都被删除,包括“example”目录本身。为了实现这一点,我使用了如下命令
find . -name example -type d -exec rm -rf {} +
感叹号问题 但在本例中,我有大量(可能 300 个左右)目录被意外上传到我的服务器,需要删除。不需要的目录都名为“!originals”。我需要删除所有目录及其所有内容。我的问题在于处理所有这些目录名称中包含的感叹号。出于某种原因,在使用上述示例之类的命令时,我无法转义该字符。我试过
find . -name *originals -type d -exec rm -rf {} +
find . -name !originals -type d -exec rm -rf {} +
find . -name \!originals -type d -exec rm -rf {} +
find . -name "\!originals" -type d -exec rm -rf {} +
find . -name '\!originals' -type d -exec rm -rf {} +
我真的认为列表中的最后一个很有潜力。但执行时什么也没发生。只是返回命令提示符,没有给出任何错误,也没有文件或目录受到影响。
如果这个问题在其他地方已经得到解答,我深表歉意。但考虑到我针对这个问题进行了大量的搜索,我会感到惊讶。在发布之前,我已经尝试了所有我能想到的方法来寻找解决方案。所以我希望这是一个有效的问题,有人有一个可行的解决方案。在此先感谢所有提供帮助的人。
答案1
的转义规则!
有点奇怪,因为历史扩展的工作阶段与所有其他 shell 特殊字符不同。通常情况下,\!
和'!'
应该是两种有效的方法。
您可以使用set +o histexpand
禁用历史记录扩展。这将生成!
一个正常字符。
我建议建立find
命令逐步地– 这样就可以更容易地缩小问题范围:
用于
echo
找出转义规则(因为所有命令都同样受到它们的影响):echo find -name !originals echo find -name \!originals echo find -name '!originals'
测试仅比较名称的最小搜索,然后打印出结果:
find . -name '!originals' (or) find . -name '!originals' -ls
然后扩展检查以仅考虑目录,但仍然让它打印出结果而不是对它们执行任何操作:
find . -name '!originals' -type d (or) find . -name '!originals' -type d -print (or) find . -name '!originals' -type d -ls
一旦结果看起来正确,实际上就进行删除 - 此时,您知道条件
find
是正确的,其余的取决于rm
:find . -name '!originals' -type d -exec rm -rvf {} +