繁体   English   中英

遍历用于bash find命令的模式

[英]Looping through a pattern for use in a bash find command

我正在尝试编写一个简单的bash脚本来浏览目录并删除与模式匹配的文件的所有版本(最新的2个除外)。 这个命令很好用:

find . -type f -name 'a.*.log' -printf '%T@\t%p\n' \
  | sort -t $'\t' -g \
  | head -n -2 \
  | cut -d $'\t' -f 2- \
  | xargs rm -f

这将使用以下文件:a.1.log,a.2.log和a.3.log,并删除a.1.log(假设它是最旧的时间戳记)。 文件名的版本部分是一个哈希,因此不是按数字顺序(为了简单起见,我对其进行了更改)。

因此,我想做的是遍历一组不同的模式,并将每个模式提供给上面的find命令。 我已将本示例的脚本简化为如下所示:

#!/bin/bash
FILES="a.*.log
b.*.log
c.*.log"

for f in $FILES
do
    echo "Processing $f"
    find . -type f -name "$f"
done

我从中运行此文件的目录包含以下文件:

a.1.log, a.2.log, a.3.log, b.1.log, b.2.log, b.3.log, c.1.log, c.2.log, c.3.log

我从上面的脚本获得的输出是:

Processing a.1.log
./a.1.log
Processing a.2.log
./a.2.log
Processing a.3.log
./a.3.log
Processing b.1.log
./b.1.log
Processing b.2.log
./b.2.log
Processing b.3.log
./b.3.log
Processing c.1.log
./c.1.log
Processing c.2.log
./c.2.log
Processing c.3.log
./c.3.log

我需要的是输出看起来像这样:

Processing a.*.log
./a.1.log
./a.2.log
./a.3.log
Processing b.*.log
./b.1.log
./b.2.log
./b.3.log
Processing c.*.log
./c.1.log
./c.2.log
./c.3.log

我试过使用数组而不是遍历字符串,转义文件模式,在查找中使用单引号或双引号等,但是我无法用它简单地将模式替换为查找。 如果我手动运行查找结果,它将为我提供所需的输出:

$ find . -type f -name "a.*.log"
./a.1.log
./a.2.log
./a.3.log
$ find . -type f -name "b.*.log"
./b.1.log
./b.2.log
./b.3.log
$ find . -type f -name "c.*.log"
./c.1.log
./c.2.log
./c.3.log

我找不到有人通过一组模式循环并将其替换为命令的任何示例。 任何帮助都是极好的。

谢谢。

您遇到的问题是,如果不对引号变量进行拆分,但是还会发生文件混乱,可以使用shell选项noglob set -f或使用数组并使用双引号来避免:

files=( 'a.*.log' 'b.*.log' 'c.*.log' )

for f in "${files[@]}"; do
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM