如何在 Bash 脚本中使用通配符循环遍历目录或文件列表?

如何在 Bash 脚本中使用通配符循环遍历目录或文件列表?

我尝试在 7 天后匿名化我的 Apache 日志,但实际上我在编写匿名化脚本时已经遇到了一些麻烦。

我的脚本用 替换了前 3 位数字,X并且在与 bash 脚本位于同一目录中的日志文件中运行时它可以正常工作。

但我想使用通配符来匿名化来自我的子域的所有日志,如下所示:

./anonym /basedir/*/logs/access.log

但这不能正常工作。

这是我的脚本:

#!/bin/bash

while IFS='' read -r line || [[ -n "$line" ]]; do
        echo "$line"  | sed s/./X/1 | sed s/./X/2 |sed s/./X/3
done < "$1">"/tmp/$1"

mv "/tmp/$1" "$1"

谢谢你的帮助。

答案1

要对多个文件执行相同的操作,您需要将代码包装在循环中,例如:

#!/bin/bash

tmpfile=/tmp/anon.$$

for path; do
    while IFS='' read -r line || [[ -n "$line" ]]; do
        echo "$line" | sed -e s/./X/1 -e s/./X/2 -e s/./X/3
    done < "$path" > "$tmpfile"

    mv "$tmpfile" "$path"
done

答案2

由于你最终会写入同一个文件,所以只需使用sed -i(尽管它不是 POSIX)。从man 1 sed

-i[SUFFIX]--in-place[=SUFFIX]
就地编辑文件(如果提供了扩展,则进行备份)。默认操作模式是断开符号和硬链接。可以使用--follow-symlinks和进行更改--copy

此外,以下 sed 表达式可以替换您的三个单独的表达式:s/.../XXX/。一般来说,它并不完全等同,也许您想改进它。无论如何,-i您需要做的就是:

sed -i `s/.../XXX/` /basedir/*/logs/access.log

相关内容