Как очистить содержимое всех файлов с помощью команды find
Есть ли простой шаг для очистки содержимого всего файла .log с помощью команды find.
В настоящее время я использую "echo -n > filename.log", я пробовал echo -n > /var/application-logs/*.log, но он не работает..
Есть ли лучший способ очистить содержимое нескольких файлов?
2 ответа
Очистить все find /var/application-logs -type f -name "*.log"
находит, используйте это:
find /var/application-logs -type f -name "*.log" -exec tee {} \; </dev/null
Если ваша версия find поддерживает это, используйте +
вместо \;
использовать один запуск тройника для всех файлов. В качестве альтернативы, если достаточно оболочки:
tee /var/application-logs/*.log </dev/null
Если вы хотите остановить рост ваших журналов, используйте logrotate
, Вы не должны слепо вытирать журналы только потому, что они полны. Есть хорошие HOWTO для разных дистрибутивов.
В качестве альтернативы рассмотрите возможность использования сервера системного журнала, такого как rsyslog
или же syslog-ng
,
Я столкнулся с аналогичной ситуацией, когда мне пришлось удалить журналы контейнера Docker с расширением ".log" с помощью команды или сценария оболочки (это было для конкретного сценария)
Вот сценарий
#!/bin/bash
#SHELL SCRIPT TO DELETE THE CONTENT OF THE DOCKER CONTAINER LOG FILES
#Declaring Array
file_list=()
#While loop to read log file name
while IFS= read -d $'\0' -r file ; do
file_list=("${file_list[@]}" "$file")
done < <(find /var/lib/docker/containers/ -type f -name "*.log" -print0)
#Printing log file names
echo "${file_list[@]}"
#Deleting the content of the log files
for f in "${file_list[@]}";do
if [ -f $f ]
then
: > "$f"
fi
done
Объяснение элементов Bash
file_list=()
это массив, содержащий результаты
find /var/lib/docker/containers/ -type f -name "*.log"
Цикл while используется для чтения имен файлов журнала
while IFS= read -d $'\0' -r file ; do
file_list=("${file_list[@]}" "$file")
done < <(find /var/lib/docker/containers/ -type f -name "*.log" -print0)
где
find
подпроцесс используется
while
команда через
<
и
IFS= read -d $'\0' -r file
это условие while
который считывает одну строку ввода из
find
команда.
echo "${file_list[@]}"
- распечатать имя файла, хранящегося в массиве.
for f in "${file_list[@]}";do
if [ -f $f ]
then
: > "$f"
fi
done
В приведенном выше фрагменте for-(if)-loop цикл считывает каждый файл из массива
${file_list[@]}
и
if
заявление
then
очищает содержимое файла с помощью
: > "$f"