用Shell程序解决自己的需求


由于助教工作的需要,需要把先前收到的学生的作业重新组织下。考虑到学生作业多,若要纯手工操作,会是件相当麻烦的事情,于是决定写个shell脚本来解决这个问题。此前shell基本没用过,仅仅用了十来行代码,但还是花了我一天多的时间。虽然如此,觉得还是蛮有成就感,毕竟印象中这还是第一次自己写程序解决自己遇到的问题。

需求描述

有一百个学生,每个学生交了三次作业。第N次作业存放在命名为第N次作业的文件夹中,共有三个文件夹,分别是第一次作业,第二次作业,第三次作业。学生的作业以学号_姓名_第N次作业命名。现在要把学生的三次作业均存在以其学号命名的文件夹里。假设学生的学号为2011001,那么就需要创建一个以2011001命名的文件夹,然后把这个学生的三次作业全部转存到这个文件夹里。其他学生,以此类推。

需求解决方法

1、用shell脚本创建以学号命名的文件夹。

#!/bin/sh

cat  学生名单.txt | while read line
do
    echo $line 
    num=`echo $line | awk '{print $1}'`  # 学生名单文件中每行的第一个字段是学号
    mkdir "../新的作业目录/$num"
done

2、用shell脚本转移学生的作业(作业文件或作业目录)。

#!/bin/bash

cat  学生名单.txt | while read line
do
    num=`echo $line | awk '{print $1}'`
    echo $num
#    read num
    find .\ -maxdepth 2  -name "*${num}*" -print -exec mv {} ../新的作业目录/${num} \;

done

遇到的问题

1、shell脚本中变量赋值的问题。“=”两边注意不能有空格。

2、在“学生名单.txt”文件中,只有学号字段情况下,num变量无法取到值。这个问题还不知道原因。

3、find 搜索的深度通过设置-maxdepth 2 可以进行控制。

其实,在写shell脚本时遇到好多问题,主要是对awk,find等命令不熟悉所致。

参考资料

在写这个小程序时,从网上查到许多资料,链接如下:

1、Linux Grep命令使用的详细介绍

2、shell 之find

3、BASH 中的字符串处理

相关内容