Чтобы очистить все find / var / application-logs -type f -name "* .log"
находит, используйте следующее:
find /var/application-logs -type f -name "*.log" -exec tee {} \; </dev/null
Если ваша версия find поддерживает в нем используйте +
вместо \;
, чтобы использовать один проход tee для всех файлов. В качестве альтернативы, если достаточно указать глобуса оболочки:
tee /var/application-logs/*.log </dev/null
Я столкнулся с похожей ситуацией, когда мне пришлось удалить журналы контейнера 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
file_list=()
представляет собой массив, содержащий результаты find /var/lib/docker/containers/ -type f -name "*.log"
В то время как цикл используется для чтения имен файлов журнала
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) фрагмент, цикл считывает каждый файл из массива ${file_list[@]}
и оператор if
then
очищает содержимое файла, используя : > "$f"