Как очистить содержимое всех файлов с помощью команды 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"

Другие вопросы по тегам