我有一棵大树,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
是为了处理通配符。当然,这是假设您的任何文件名中都没有换行符。如果这样做,解决方案将变得更加复杂。