如何将输出重定向到名称基于当前时间的多个文件?

时间:2018-04-10 10:02:16

标签: linux bash output-redirect

考虑以下命令:

while true; do echo 'Hit CTRL+C';sleep 1;done >> `date +"%H%M.txt"`

当我执行此命令时,它将输出重定向到单个文件,文件名作为命令的开始时间。如何更改此设置,以便每分钟使用文件名

保存到其他文件
 date +"%H%M.txt"

在那一分钟?

编辑:

while true; do echo 'Hit CTRL+C';sleep 1;done

只是一个可以运行很长时间并且每秒输出一些数据的程序的替代品。我希望将每分钟输出的数据保存到一个单独的文件中,而不必重新启动我的程序。

3 个答案:

答案 0 :(得分:0)

您需要在每个循环实例上重新评估日期。

while true; do echo 'Hit CTRL+C' > "`date +"%H%M"`.txt"; sleep 1; done 

答案 1 :(得分:0)

#!/bin/bash

while true ; do 
    echo 'Hit CTRL+C'       # just for the screen
    stock=$( date +"%H%M" ) 

    while [[ $( date +"%H%M" ) == $stock ]] ; do 
        echo 'Hit CTRL+C' $stock
        sleep 1
    done > "$stock.txt"     # no need '>>'
done

关于每分钟的磁盘访问

答案 2 :(得分:0)

长时间运行命令的输出应重定向到中间位置(fifo),然后使用cat在每分钟从此fifo中将日志记录到不同的文件中。

这是一个简单的脚本包装器,使用SIGUSR1更新日志文件名。用你的命令替换long-running-cmd

# in seconds
logger_update_duration=60

background_pid=
main_cmd=

function update_file_name() {
    trap "update_file_name" USR1 # re-establish

    file_name=$(date +"%Y-%m-%d-%H-%M-%S.log")
    echo "update file name $file_name"

    cat < ./logger > $file_name &
    # after establish the new, check should kill the old
    if [ x$background_pid != x ];then
        echo "will kill the old $background_pid current is $$"
        kill -TERM $background_pid
    fi
    background_pid=$!
}
trap "update_file_name" USR1

function clean() {
    echo "perform clean..."
    kill -TERM $!
    kill -TERM $main_cmd
    rm logger
}
trap "clean" EXIT


# create logger fifo
[ ! -p logger ] && mkfifo logger

# replace with your long time running operation
./long-running-cmd > ./logger &
main_cmd=$!

while true
do 
    kill -USR1 $$
    sleep ${logger_update_duration}
done

long-running-cmd的输出应在一分钟内分成不同的日志文件。