美文网首页
Shell脚本生成图片清单

Shell脚本生成图片清单

作者: 咫尺是梦 | 来源:发表于2018-04-20 17:16 被阅读0次

    本文以caffe程序中自带的图片为例,进行讲解,图片目录是 example/images/, 两张图片,一张为cat.jpg, 另一张为fish_bike.jpg,表示两个类别。


    上述图片

    我们创建一个sh脚本文件,调用linux命令来生成图片清单:

    # sudo vi examples/images/create_filelist.sh
    

    编辑这个文件,输入下面的代码并保存

    # /usr/bin/env sh
    DATA=examples/images
    echo "Create train.txt..."
    rm -rf $DATA/train.txt
    find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
    find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
    cat $DATA/tmp.txt>>$DATA/train.txt
    rm -rf $DATA/tmp.txt
    echo "Done.."
    

    最终生成如下的一个train.txt文件:

    cat.jpg 1
    fish-bike.jpg 2
    

    备注:

    1.Shell使用变量

    使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

    your_name="qinjx"
    echo $your_name
    echo ${your_name}
    

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

    for skill in Ada Coffe Action Java; do
        echo "I am good at ${skill}Script"
    done
    

    如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

    推荐给所有变量加上花括号,这是个好的编程习惯。

    已定义的变量,可以被重新定义,如:

    your_name="tom"
    echo $your_name
    your_name="alibaba"
    echo $your_name
    

    这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。

    2.find命令

    参考find命令
    根据文件或者正则表达式进行匹配

    列出当前目录及子目录下所有文件和文件夹

    find .
    

    在/home目录下查找以.txt结尾的文件名

    find /home -name "*.txt"
    

    同上,但忽略大小写

    find /home -iname "*.txt"
    

    当前目录及子目录下查找所有以.txt和.pdf结尾的文件

    find . \( -name "*.txt" -o -name "*.pdf" \)
    

    find . -name "*.txt" -o -name "*.pdf" 
    

    匹配文件路径或者文件

    find /usr/ -path "*local*"
    

    3. |命令

    在linux中,&和&&,|和||介绍如下:

    & 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &

    && 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'

    | 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l

    || 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"

    4.cut命令

    参考 linux之cut用法

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

    (1)其语法格式为:

    cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file]
    

    使用说明
    cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
    如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

    主要参数
    -b:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
    -c :以字符为单位进行分割。
    -d :自定义分隔符,默认为制表符。
    -f :与-d一起使用,指定显示哪个区域。
    -n:取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

    (2)cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?

    cut命令主要是接受三个定位方法:

    第一,字节(bytes),用选项-b

    第二,字符(characters),用选项-c

    第三,域(fields),用选项-f

    (3)域是怎么回事呢?解释解释:)

    为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。

    我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!

    以/etc/passwd的前五行内容为例:

    [rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    [rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1
    root
    bin
    daemon
    adm
    lp
    

    看到了吧,用-d来设置间隔符为冒号,然后用-f来设置我要取的是第一个域,再按回车,所有的用户名就都列出来了!呵呵 有成就感吧!

    5.sed命令

    参考Linux sed命令

    数据的搜寻并替换

    除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:

    sed 's/要被取代的字串/新的字串/g'
    

    先观察原始信息,利用 /sbin/ifconfig 查询 IP

    [root@www ~]# /sbin/ifconfig eth0
    eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
    inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
    inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    .....(以下省略).....
    

    本机的ip是192.168.1.100。

    将 IP 前面的部分予以删除

    [root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
    192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
    

    接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

    将 IP 后面的部分予以删除

    [root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
    192.168.1.100
    

    6.linux >和>>的区别,<号使用

    linux中经常会用到将内容输出到某文件当中,只需要在执行命令后面加上>或者>>号即可进入操作。

    大于号:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)

    小于号:命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入

    >>是追加内容

    >是覆盖原有内容

    示例:

    1.  bogon:Desktop wenxuechao$ echo 'abc' > test.txt  
    2.  bogon:Desktop wenxuechao$ echo '123' >> test.txt  
    

    执行效果,第一句命令会在桌面创建个test.txt的文件,并且将abc写到文件中。

    第二句命令,会在文件下方,再次写入内容。

    <小于号

    1.  mysql -u root -p -h test < test.sql 导入数据
    

    7. Linux cat命令详解

    cat主要有三大功能:

    1.一次显示整个文件。

    $ cat   filename
    

    2.从键盘创建一个文件。

    $ cat  >  filename
    

    只能创建新文件,不能编辑已有文件.

    3.将几个文件合并为一个文件。

    $cat   file1   file2  > file
    

    cat具体命令格式为 : cat [-AbeEnstTuv] [--help] [--version] fileName

    说明:把档案串连接后传到基本输出(屏幕或加 > fileName 到另一个档案)
    参数:
    -n 或 –number 由 1 开始对所有输出的行数编号
    -b 或 –number-nonblank 和 -n 相似,只不过对于空白行不编号
    -s 或 –squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
    -v 或 –show-nonprinting

    范例

    把 linuxfile1 的档案内容加上行号后输入 linuxfile2 这个档案里:

    cat -n linuxfile1 > linuxfile2 
    

    把 linuxfile1 和 linuxfile2 的档案内容加上行号(空白行不加)之后将内容附加到linuxfile3 里:

    cat -b linuxfile1 linuxfile2 >> linuxfile3 
    

    清空/etc/test.txt档案内容:

    cat /dev/null > /etc/test.txt  
    

    8.^与$

    ^代表行首
    $代表行尾
    ^$意思就是行首之后就是行尾,中间什么也没有,所以代表空行
    则在sed命令中:

    s/$//在每一行后面追加空. s为搜索 如s/a/b/ 搜索a 将替换为b ,并只替换一次.
    s/ *//g将空格删除. g代表搜索到的全部替换 。“空格星”( " *") 代表多个空格
    /^$/d 删除空行.

    8.linux下""的作用

    例一:

    [linux@linux ~]$ echo $HOME
    /home/
    [linux@linux ~]$ echo \$HOME
    $HOME
    

    例子中,反斜线去除了“ $ ”字符的特殊意义,保留字面值,从而不输出home目录路径。

    例二:

    export PATH=\
    /bin:\
    /sbin:\
    /usr/bin:\
    /usr/sbin:\
    /usr/local/bin:\
    /apps/bin:\
    /apps/tools:\
    /apps/tslib/bin\
    

    例子中,反斜线使行得以继续,命令可以正常输入。

    相关文章

      网友评论

          本文标题:Shell脚本生成图片清单

          本文链接:https://www.haomeiwen.com/subject/qplzkftx.html