Как перебрать каталог или список файлов с подстановочным знаком в скрипте Bash?
Я пытаюсь анонимизировать свои логи Apache через 7 дней, и на самом деле у меня уже есть проблемы с написанием скрипта для анонимизации.
Мой скрипт заменяет 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"
Спасибо за любую помощь.
2 ответа
Чтобы выполнить одни и те же действия для нескольких файлов, вам нужно заключить код в цикл, например:
#!/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
Поскольку в конце концов вы пишете в один и тот же файл, просто используйте 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