shell脚本:将指定目录下的执行文件的结果写入指定文件中

本文介绍了一个实用的Shell脚本,能够遍历指定目录下的所有子目录及文件,创建对应的输出目录,并执行特定的二进制文件,将执行结果记录到相应的文本文件中。此外,还提供了一个包含计时功能的版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shell脚本:将指定目录下的执行文件的结果写入指定文件中

这个脚本使我写的第一个真正有用的脚本,折腾了半天。主要可以实现的功能就是:1、得到一个路径下的所有文件夹名。2、在得到子路径下的文件夹名。3、得到该路径下的所有文件名。4、在制定位置创建文件。5、将指定路径下的二进制文件执行的结果写入指定路径下的文件中。

#!/bin/bash
dir=$(ls -l /home/lion/yuedata/RGB |awk '/^d/ {print $NF}')
for i in $dir
do
    path1='/home/lion/yuedata/RGB/'"${i}"
    echo $path1

    mdir1='/home/lion/yuedata/outRGB/'"${i}"
    echo $mdir1    
    mkdir $mdir1

    dir1=$(ls -l $path1  |awk '/^d/ {print $NF}')

    for j in $dir1
    do
        mdir2='/home/lion/yuedata/outRGB/'"${i}/""${j}"
        echo $mdir2
        mkdir $mdir2

        path2="${path1}/""${j}"
        echo $path2
        cd $path2

        for filename in `ls`
        do 
            echo $filename
            createfile="touch /home/lion/yuedata/outRGB/${i}/${filename}.txt"
            $createfile

            cmd="eval /home/lion/yuelib/dense_trajectory_release_v1.2/release/DenseTrack ${path1}/${filename} -L 30 >> /home/lion/yuedata/outRGB/${i}/${filename}.txt"
            $cmd
        done
    done
done

连接:shell eval命令使用 http://blog.youkuaiyun.com/w_ww_w/article/details/7075867

带有计时功能的版本:

#!/bin/bash
dir=$(ls -l /home/lion/yuedata/RGB |awk '/^d/ {print $NF}')
for i in $dir
do
    path1='/home/lion/yuedata/RGB/'"${i}"
    echo $path1

    mdir1='/home/lion/yuedata/outRGB/'"${i}"
    echo $mdir1    
    mkdir $mdir1

    dir1=$(ls -l $path1  |awk '/^d/ {print $NF}')

    for j in $dir1
    do
        mdir2='/home/lion/yuedata/outRGB/'"${i}/""${j}"
        echo $mdir2
        mkdir $mdir2

        path2="${path1}/""${j}"
        echo $path2
        cd $path2

        for filename in `ls`
        do 
            echo $filename
            createfile="touch /home/lion/yuedata/outRGB/${i}/${filename}.txt"
            $createfile

            cmd="eval /home/lion/yuelib/dense_trajectory_release_v1.2/release/DenseTrack ${path1}/${filename} -L 30 >> /home/lion/yuedata/outRGB/${i}/${filename}.txt"

            start=`date +"%Y-%m-%d %H:%M:%S"`            
            $cmd
            end=`date +"%Y-%m-%d %H:%M:%S"`
            Sys_start=`date -d  "$start" +%s`
            Sys_end=`date -d  "$end" +%s`
            echo 'time per avi: '$(($Sys_end-$Sys_start))' s'  
        done
    done
done

<think>嗯,用户这次想解决的是shell脚本重定向top命令输出的问题。结合用户历史提问记录,发现用户之前深入询问过线程内存监控,现在转向了输出重定向技术,说明ta正在搭建一个系统监控工具链。用户提供的四个引用中,[1]详细解释了exec重定向的语法,特别强调了2>&1的用法;[2]补充了内联重定向知识;[3]提到了重定向的兼容性问题;[4]则给出了类似需求的参考实现。这些都需要整合到方案中。注意到用户可能存在的隐藏需求:1.需要定期监控(因为提到固定周期)2.可能需要过滤特定进程(历史问题关注线程级监控)3.输出格式可能需要处理(原始top输出包含控制字符)解决方案需要重点考虑:-使用-b批处理模式避免控制字符-重定向文件时处理标准错误-周期性执行需要结合while/sleep-如需要精确时间戳可参考[4]的date用法对于文件位置的选择,用户可能不熟悉Linux目录规范,需要明确说明绝对路径或相对路径的区别。补充建议用/dev/shm内存文件系统可能对高频写入有帮助,但这个进阶技巧需要标注。用户没有说明监控频率,按经验默认60秒比较合理。如果监控进程是动态变化的,还需要考虑pid获取机制,不过当前问题聚焦在重定向,暂时不扩展。</think> 在 Shell 脚本中将 `top` 命令输出保存到文件,需使用**批处理模式**结合**输出重定向**。以下是具体方案: --- ### 1. 基础重定向(单次执行) ```bash #!/bin/bash # 将 top 输出(包括错误)重定向文件 top -b -n 1 > top_output.log 2>&1 ``` * **`-b`**:批处理模式(禁止交互式输出)[^4] * **`-n 1`**:仅执行 1 次 * **`> top_output.log`**:标准输出重定向文件 * **`2>&1`**:错误输出合并到标准输出[^1] --- ### 2. 周期性监控(带时间戳) ```bash #!/bin/bash INTERVAL=60 # 间隔秒数 OUTPUT_FILE="monitor.log" while true; do # 添加时间戳 echo "===== $(date '+%Y-%m-%d %H:%M:%S') =====" >> $OUTPUT_FILE # 输出 top 命令结果(仅显示头部和进程) top -b -n 1 -o %MEM | head -n 15 >> $OUTPUT_FILE sleep $INTERVAL done ``` * **`-o %MEM`**:按内存使用排序进程 * **`head -n 15`**:截取前15行(避免过多数据)[^4] * **`>>`**:追加模式(不覆盖历史记录) 执行脚本:`nohup ./monitor.sh &`(后台持续运行) --- ### 3. 监控特定进程 ```bash top -b -n 1 -p $(pgrep -d',' myapp) > app.log 2>&1 ``` * **`-p PID1,PID2`**:仅监控指定进程 * **`pgrep -d',' myapp`**:查找进程名为 `myapp` 的 PID 列表 --- ### ⚠️ 注意事项 1. **文件权限**:确保脚本有权限写入目标文件 2. **磁盘空间**:长期运行需监控日志大小 3. **输出优化**: - 用 `grep` 过滤关键行:`top -b -n1 | grep "Cpu(s)"` - 用 `awk` 提取列数据:`top -b -n1 | awk '/Mem/{print $4}'` --- ### 输出示例 ```log ===== 2023-10-05 14:30:00 ===== top - 14:30:00 up 20 days, 3:45, 1 user, load avg: 0.12, 0.15, 0.09 Tasks: 125 total, 1 running, 124 sleeping %Cpu(s): 2.3 us, 0.7 sy, 0.0 ni, 97.0 id MiB Mem : 7916.8 total, 102.4 free, 4096.2 used, 3718.2 buff/cache MiB Swap: 2048.0 total, 2048.0 free, 0.0 used PID USER PR NI %MEM VIRT RES SHR S %CPU TIME+ COMMAND 3567 appuser 20 0 12.5 983724 654392 984 S 2.3 12:45.1 myapp ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值