如何删除大树中特定命名文件夹中具有特定扩展名的所有文件?

如何删除大树中特定命名文件夹中具有特定扩展名的所有文件?

我有一棵大树,pdf里面有很多文件。我想删除pdf这棵树中的文件,但仅限于pdf名为 的子文件夹中的文件,rules/里面还有其他类型的文件rules/。该rules/子文件夹没有其他子文件夹。

例如,我有这棵树。 “来源”以下的所有内容

  source/
         A/
            rules/*.pdf, *.txt, *.c,etc..
            etc/
         B/
            keep_this.pdf                
            rules/*.pdf
            whatever/
         C/ 
            D/
               rules/*.pdf
               something/

等等。pdf到处都有文件,但我只想删除pdf名为的文件夹中的所有文件rules/,而不是其他地方。

我想我需要使用

  cd source
  find  / -type d -name "rules"  -print0 | xargs -0 <<<rm *.pdf?? now what?>>>

但我不知道在获取所有命名子文件夹的列表后该怎么做rules/

任何帮助表示赞赏。

在 Linux 薄荷上。

答案1

我会find在另一个里面执行一个find。例如,我将执行此命令行以列出要删除的文件:

$ find /path/to/source -type d -name 'rules' -exec find '{}' -mindepth 1 -maxdepth 1 -type f -iname '*.pdf' -print ';'

然后,在检查列表后,我将执行:

$ find /path/to/source -type d -name 'rules' -exec find '{}' -mindepth 1 -maxdepth 1 -type f -iname '*.pdf' -print -delete ';'

答案2

使用支持扩展 glob 和 null glob 的 shell,例如zsh

for d in ./**/rules/
do
set -- ${d}*.pdf(N)                               
(( $# > 0 )) && printf %s\\n $@
done

或者bash

shopt -s globstar
shopt -s nullglob
for d in ./**/rules/
do
set -- "${d}"*.pdf
(( $# > 0 )) && printf %s\\n "$@"
done

如果您对结果满意,请替换printf %s\\n为。rm


由于您使用的是 gnu/linux,您还可以运行:

find . -type f -regextype posix-basic -regex '.*/rules/[^/]*.pdf' -delete

-delete如果您想进行试运行,请删除。

答案3

最简单的是

find source -name '*.pdf' -path '*/rules/*.pdf' -exec rm '{}' +

为什么是第一个-name?因为这样会快一点。也不+是用多个参数;执行一个rm,而是用一个参数执行多个。因此产生的进程较少。在 bash 中你可以不用引用就逃脱{}

答案4

您可以使用 bash 脚本来执行此操作(不是最好的方法):

#!/bin/bash

# Don't screw us up with spaces!
IFS=$'\n'; set -f

DIRS=$(find . -type d -name "rules")

for i in $DIRS; do
  set +f
  rm $i/*.pdf
done
set +f

这将循环访问您在命令中找到的目录find,并删除每个目录下的 pdf 文件。

该行IFS=$'\n'是为了处理文件名中的空格,并且set -f是为了处理通配符。当然,这是假设您的任何文件名中都没有换行符。如果这样做,解决方案将变得更加复杂。

相关内容