我需要使用每日脚本删除文件夹内的所有文件夹。那天的文件夹需要留下。
文件夹“myfolder”有 3 个子文件夹:“test1”、“test2”和“test3”我需要删除除“test2”之外的所有文件夹。
我想在这里匹配确切的名称:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
或者
find /home/myfolder -type d ! -name 'test2' -delete
此命令也总是尝试删除主文件夹“myfolder”!有没有办法避免这种情况?
这将删除
./myfolder
除此之外的所有文件夹,./myfolder/test2
并保留其所有内容:这个怎么运作
find
启动查找命令。./myfolder
告诉 find 从目录./myfolder
及其内容开始。-mindepth 1
不匹配./myfolder
自己,只是它下面的文件和目录。! -regex '^./myfolder/test2\(/.*\)?'
告诉 find 排除 (!
) 任何匹配正则表达式的文件或目录^./myfolder/test2\(/.*\)?
。^
匹配路径名的开头。该表达式(/.*\)?
匹配 (a) 斜线后跟任何内容或 (b) 什么都不匹配。-delete
告诉 find 删除匹配的(即非排除的)文件。例子
考虑一个看起来像这样的目录结构;
我们可以运行 find 命令(不带
-delete
)来查看匹配的内容:我们可以通过查看剩余的文件来验证这是否有效:
使用 bash:
例子:
tl;博士
如果对文件列表满意,请删除 echo。
使用
-mindepth 1
将确保不选择顶级目录。但是 a
-not -name test2
不会避免内部的子目录test2
:为此,您需要类似 prune 的东西:
但不要使用
delete
,因为它暗示depth
着,这将从最长的路径开始擦除:要么使用
rm -rf
(echo
如果您想实际擦除,请删除):或者,如果您只需要删除目录(以及其中的所有内容) ,也可以使用(删除以实际擦除):
maxdepth
echo
-delete
如果目录不为空,A仍然会失败:如果您使用的是 zsh,那么您可以:
^foo
是一个 glob,表示除 之外的所有内容foo
,并且(/)
是一个 glob 限定符,表示 glob 应该只匹配目录。如果要求仅针对问题中提到的一级(不超过深度 1),这是另一个简单的选择:
细节:
ls myfolder/
myfolder/
列出目录中的所有文件夹和文件grep -v "test2"
匹配除“test2”之外的所有内容xargs rm -r
将前一个命令的输出通过管道传输到rm -r
命令。用下面的命令测试,它工作正常