如何删除除目录中的文件之外的所有文件?

如何删除除目录中的文件之外的所有文件?

我想递归删除所有 .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

相关内容