我想递归删除所有 .pyc 和 .pyo 文件,但排除某个目录。我刚刚遇到了一些限制,find 在忽略时无法删除。我尝试将结果传输到,xargs rm
但也失败了。
find . -not \( -path somedir -prune \) -name '*.py[co]' -exec rm '{}' \;
错误:
find: The -delete action atomatically turns on -depth, but -prune does nothing when -depth is in effect. If you want to carry on anyway, just explicitly use the -depth option.
这也失败了:
find . -type f -not -path 'somdir/*' -name '*.py[co]' -print0 | xargs -0 rm
版本:
- 操作系统:Ubuntu 14.04 LTS
- 查找版本 4.4.2
答案1
您似乎混淆了如何-not
进行-prune
交互。通常的做法是“找到这个并修剪它,或者找到这个并修剪它,或者找到这个并实际处理它。”
find . -path somedir -prune -o -name '*.py[co]' -delete
我用 which 替换,-exec ...
运行-delete
内置删除操作,无需外部进程。如果您-exec
在某个时候想要做其他事情,也许可以使用-exec command {} +
而不是-exec command {} \;
(请注意,周围的单引号{}
实际上没什么用;无论如何,shell 都会在find
运行之前处理并删除它们)。
答案2
如果“somedir”不是很多,可以暂时删除写权限,然后-name '*.py[co]' -delete
全部删除。
记住将写入权限添加回“somedir”。
Br,
答案3
使用 进行过滤awk
,然后使用xargs
运行命令?
find . -type f -name '*.py[co]' -print0 \
| awk -vRS='\0' '!/^.\/somedir\//' \
| xargs -0 rm
awk
参数:
-vRS='\0'
将 RS(记录分隔符)设置为 nul(\0
),而不是默认值(\n
)!
对正则表达式取反^./somedir/
任何以...开头的记录./somedir/
- 不要忘记转义正则表达式/路径斜杠-原始正则表达式变成:
^.\/somedir\/
- 不要忘记转义正则表达式/路径斜杠-原始正则表达式变成:
答案4
因此,看来我需要明确地在目录前面加上前缀.
。我不确定我是否完全理解为什么,但对于处于这种情况的其他任何人来说:
失败:
find . -type f -not -path 'somdir/*' -name '*.py[co]' -print0 | xargs -0 rm
作品:
find . -type f -not -path './somdir/*' -name '*.py[co]' -print0 | xargs -0 rm