您的位置:新葡亰496net > 电脑系统 > 领取文件名和目录名的有的主意总结,提取文件

领取文件名和目录名的有的主意总结,提取文件

发布时间:2019-08-03 16:28编辑:电脑系统浏览(119)

    要做一项工作,内容是将一个word中的图表复制到多个(接近300个)word文档的末尾,不想一个个CTRL C CTRL V,就想到了用程序来实现

    很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。

     

    昨天在往github上面push东西的时候,突然感觉我真是太蠢了,一个学计算机的,居然没有想到把三个命令集成在一个shell脚本里面。通过传入俩个参数,一个文件名,一个关于的递交的信息,这样不就一条命令就好了,还省了很多的事。但是准备写的时候,发现不怎么会使用shell编程,所以查阅了一些资料,决定写一篇关于shell编程的文章吧。这样,即使以后我忘记了,也可以方便查阅。最后,这篇文章是为了那些不会shell,或者不这么熟悉shell的同学,方便以后批处理文件,或者其他的事情。

      初学shell脚本,过程中发现许多不易于理解的脚本语言,网上各种查找学习之后,择优精简一番,做出以下总结,方便以后遗忘了回顾,也为像我一样的初学者提供方便——推荐给初学者的一本书:《Linux Shell脚本攻略》【印】Sarath Lakshman,作者是印度人,对于shell命令的总结可谓是非常详尽。

    我第一个想到的使用python来实现,由于技术太渣,尝试了多次,没能写出来,只记得有一个叫做win32com的模块,专门处理文档的。这里先不说了

    下面介绍两种常用的方法来进行相关的操作。

    很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。

    介绍shell脚本

    简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/sh(Bourne Shell),#!/bin/bash(Bourne Again Shell),#!/bin/csh(C Shell),#!/bin/ksh(K Shell)等等。

    不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。下面的run.sh则指明使用bash执行。

    #!bin/bash
    ls -l
    

    通常,shell脚本会以#!/bin/sh作为默认的shell程序。执行shell的方式有两种:第一种是通过sh命令执行shell脚本,第二种是为shell脚本加上可执行权限并执行,例如执行当前目录下的run.sh脚本,命令如下:

    1.通过sh命令执行shell脚本

    sh run.sh
    

    2.为shell脚本直接加上可执行权限并执行

    chmod  x run.sh
    ./run.sh
    
    chmod [who] operator [permission] filename
    
    who的含义是:
    u 文件属主权限。
    g 同组用户权限。
    o 其他用户权限。
    a 所有用户(文件属主、同组用户及其他用户)。
    
    operator的含义:
      增加权限。
    - 取消权限。
    = 设定权限。
    
    permission的含义:
    r 读权限。
    w 写权限。
    x 执行权限。
    s 文件属主和组s e t - I D。
    l 给文件加锁,使其他用户无法访问。
    
    文 件 属 主 同 组 用 户 其 他 用 户
    r w x r w x r w x
    4 2 1 4 2 1 4 2 1

    1.  重定向符号

    在查阅资料的过程中,偶然看见在linux中的cat命令似乎能做这件事,恰好我装了centos7,也在学习这Linux命令,于是转战linux。

    一、使用${}

    下面介绍两种常用的方法来进行相关的操作。

    shell 使用

    >               输出重定向到一个文件或设备 覆盖原来的文件
    >!              输出重定向到一个文件或设备 强制覆盖原来的文件
    >>             输出重定向到一个文件或设备 追加原来的文件
    <               输入重定向到一个程序

    对这个工作,我分三步进行:

    1、${var##*/}
    该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:

    一、使用${}

    参数传递

    $xxx 表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。
    例:显示文件的内容123 456.txt

    #!bin/bash
    cat "$1"
    

    有人可能会问,为什么要加",因为不加的话,执行指令时会解析成cat 123 456.txt而不是cat 123 456.txt,所以如果参数中有空格,就加上"吧。

    #!/bin/sh
    #print hello world in the console window
    a = "world"
    echo "hello, $a"    #输出    :hello world
    echo "hello, $as"   #希望输出:hello worlds
    

    echo "Hello, $as" 就不会输出“hello, worlds”,而是输出“hello, ”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:
    echo "Hi, ${a}s"

    2.  标准错误重定向符号

    1:使用cat命令将一个文档追加到另一个文档末尾

    图片 1

    1、${var##*/}
    该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:
    图片 2

    基本控制语句

    # if语句和其他编程语言相似,都是流程控制语句
    if …; then
    …
    elif …; then
    …
    else
    …
    fi
    
    # 在循环中,也可以使用类似C语言中的break和continue语句中断当前的循环操作。
    for var in …; do
    …
    done
    

    2>             将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件
    2>>           将一个标准错误输出重定向到一个文件或设备 追加到原来的文件
    2>&1         将一个标准错误输出重定向到标准输出 注释:1 可能就是代表 标准输出
    >&             将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件  c-shell
    |&              将一个标准错误 管道 输送 到另一个命令作为输入

    2:得到一个目录下的所有文件名(后面讲为什么)

    从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。

    从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。

    常用条件测试

    [ -f "$file"     ] 判断$file是否是一个文件
    [ $a -lt 3       ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于
    [ -x "$file"     ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性
    [ -n "$a"        ] 判断变量$a是否有值,测试空串用-z
    [ "$a" = "$b"    ] 判断$a和$b的取值是否相等
    [ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立
    

    3.  shell中的与(&&)和或(||)

    3:   写shell脚本实现功能

    若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}

    若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}

    截取文件名信息

    #:表示从左边算起第一个
    %:表示从右边算起第一个
    ##:表示从左边算起最后一个
    %%:表示从右边算起最后一个
    basename 和 dirname
    

    例如:
    1、${var##*/}
    该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。

    #!bin/bash
    var = /dir1/dir2/file.txt
    echo ${var##*/}
    # echo 输出到屏幕
    # 输出:file.txt
    

    2、${var%%.*}
    该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。

    #!bin/bash
    var = /dir1/dir2/file.txt
    echo ${var%%.*}
    # 输出:/dir1/dir2/file
    

    basename
    该命令的作用是从路径中提取出文件名,使用方法为basename NAME

    dirname
    该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME

    这俩条命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录。

    #!bin/bash
    var = /dir1/dir2/file.txt
    
    echo basename $var
    # 输出:file.txt
    
    echo dirname $var
    #输出:/dir1/dir2
    

    获取某目录下所有文件夹的名称

    #!/bin/bash
    for dir in $(ls .)
    do
        [ -d $dir ] && echo $dir
    done 
    

    如果第一个命令执行成功,与操作符 (&&)才会执行它之后的第二个命令
    如果第一个命令执行失败,或操作符 (||)才会执行它之后的第二个命令

    一:关于cat命令

    2、${var##*.}

    2、${var##*.}
    该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:
    图片 3

    注释,管道,重定向

    1.shell脚本和其它编程语言一样,也拥有注释。注释方法为在注释行前加#号。

    #!/bin/sh  
    #Filename: comment.sh  
    

    2.管道的作用是在一个命令的标准输出和另一个命令的标准输入之间建立一个通道。例如下面命令就是将ps -aux的标准输出传递给grep作为输入。

    #!/bin/sh 
    ps -aux | grep httpd
    

    3.输入重定向使用小于号“<”可以实现。输出重定向有两种方式,一种是直接输出,使用一个大于号“>”实现;另一种是以附加的方式输出,使用两个大于号“>>”实现。前者会覆盖原始的输出内容,而后者会添加到文件最后。

    #!/bin/sh 
    cat < dir.txt   # cat命令重定向到dir.txt文件
    
    ls > dir.txt    # ls命令重定向到dir.txt
    ls >> dir.txt   # ls命令以附加的方式重定向到dir.txt
    

    4.  用find命令查找指定目录下文件名中含关键字“xxx”的文件(递归查找)
    find /指定目录 -name '*关键字*'

    cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。 

    该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:

    从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。

    5.  文件夹处理:
    cp(复制)命令:cp -r /demo/em1 /demo/em2/em2a
    注:某文件夹下的文件复制到该文件夹下的其他文件夹“  cp 文件 /该文件夹/文件夹a  ”,不需要-r,复制文件夹到电脑其他地方文件夹前要加/,系统才能识别该文件夹,否则会提示错误.
    mv(移动)命令:mv /demo/em1 /demo/em2
    注:将某文件夹移动到其他文件夹里,要确保同级目录下不能有与其文件夹名一样的文件夹

    1.命令格式:

    图片 4

    如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。

    6.  shell中$1~$n

      cat [选项] [文件]...

    从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。

    3、${var#*.}
    该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:
    图片 5
    从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。

    指添加到shell脚本中的各参数值,$1是第1参数,意为从外面传一个参数给$1,2是第2参数

    2.命令功能:

    如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。

    4、${var%/*}
    该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:
    图片 6
    从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录

    7.  echo -e和read -p

      cat命令的功能:

    3、${var#*.}

    ${var%%.*}
    该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:
    图片 7
    当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。

    同样都有输出指定内容的功能,但read -p后输出的内容将全部显示在终端显示器上,而echo -e后则可添加其他命令,比如换行符和内容显示颜色等等

      1.一次显示整个文件:cat filename  

    该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:

    其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。

    输入命令:read -p "nHello World" x

      2.从键盘创建一个文件:cat > filename  只能创建新文件,不能编辑已有文件.

    图片 8

    看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。

    输出结果:nHello World

      3.将几个文件合并为一个文件:cat file1 file2 > file

    领取文件名和目录名的有的主意总结,提取文件名和目录名的局地措施。从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。

    #:表示从左边算起第一个

    输入命令:echo -e "nHello World"

      4.在一个文件后追加另一个文件:cat file1 >> file2

    4、${var%/*}

    %:表示从右边算起第一个

         read x

    3.命令参数:

    该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:

    ##:表示从左边算起最后一个

    输出命令:      ←此为换行符效果

      -A, --show-all           等价于 -vET

    图片 9

    %%:表示从右边算起最后一个

         Hello World

      -b, --number-nonblank    对非空输出行编号

    从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录

    换句话来说,#总是表示左边算起,%总是表示右边算起。

    8.  test ! -d $dir  

      -e                       等价于 -vE

    5、${var%%.*}

    *:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。

    test -d $dir     意为:如果文件$dir为一个目录,则为真

      -E, --show-ends          在每行结束处显示 $

    该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:

    例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

    test ! -d $dir  意为:判断文件$dir不是一个目录,则为真,命令执行成功

      -n, --number     对输出的所有行编号,由1开始对所有输出的行数编号

    图片 10

    看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。

    9.  ls -R /root

      -s, --squeeze-blank  有连续两行以上的空白行,就代换为一行的空白行 

    当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。

    二、basename和dirname

    递归查看路径root下的所有目录

      -t                       与 -vT 等价

    6、${}总结

    ${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。

    10.     2> /dev/null

      -T, --show-tabs          将跳格字符显示为 ^I

    其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。

    1、basename

    将标准错误输出重定向到空设备,即不把输出内容显示到终端显示器上

      -u                       (被忽略)

    看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。

    该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。

    11.  grep -v '^$'    过滤(删除)空白符  grep -v反转查找

      -v, --show-nonprinting   使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

    #:表示从左边算起第一个

    1)从路径中提出出文件名(带后缀),例子如下:

           grep -v -n '^$'    过滤(删除)空行   ^代表行首  $代表行尾

    这里给出几个实例:

    %:表示从右边算起第一个

    图片 11

    12.  sed 's/:.*$//g'    替换文本中的:.内容    

    1:把 file1 的文档内容加上行号后输入 file2 这个文档里

    ##:表示从左边算起最后一个

    2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:
    图片 12
    dirname
    该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
    使用例子如下:
    图片 13
    这样就提取出了file.txt文件所在的目录。

    举例说明:如果要查找某个文档里包含关键字option的位置,如果文档中有op:tion的内容,则无法被查出来,所以要替换掉字符或者空白符

    cat -n file1 > file2
    

    %%:表示从右边算起最后一个

    注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
    图片 14
    它提取出了目录dir2所在的目录dir1.

    sed更多命令请转至详细查看

    注意这里是吧file1的内容输入到file2中,file2若存在,则清空内容,里面输入file1内容,若不存在则创建file2,输入file1内容

    换句话来说,#总是表示左边算起,%总是表示右边算起。

    图片 15

    2:把 file1 和 file2 的文档内容加上行号(空白行不加)之后将内容追加到 file3 文档里:

    *:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。

    图片引自,侵权请联系笔者删除

    cat -b file1 file2 >>file3
    

    例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

    13.  管线命令 |

    该操作不会改变file3中原有的内容,把file1和file2的内容追加到file3的末尾

    看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。

    [test @test bin]# last | grep root | wc -l
    这个管线命令仅能处理经由前面一个指令传来的正确信息,也就是standard output ( STDOUT ) 的信息,对于 stdandard error 并没有直接处理的能力

    3:创建一个名为a.txt的文件

    二、basename和dirname

    14.  cd进不去主文件夹问题的解决办法:文件目录加单引号

    cat >a.txt <<EOF
    >EOF
    

    ${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。

         cd  '/Download/localhost'

     输入第一行后,输入EOF,回车,就可以生成一个 a.txt 文件。其中EOF是告诉 bash 哪个符号代表文件结束。当然你也可以使用自己习惯的符号。

    1、basename

    15.  在终端写入文本内容
    cat <<EOF>log.txt
    LOG FILE HEADER
    This is a test log file
    Function: System statistics
    EOF
       在cat <<EOF>log.txt与下一个EOF行之间的所有文本行都会被当做stdin数据

    4: 利用cat清空文件内容

    该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。

    16.  为读取文件创建一个文件描述符:
    exec 3<input.txt  
    使用文件描述符3打开并读取文件 我们可以这样使用它:
    echo this is a test line > input.txt
    exec 3<input.txt
    现在你就可以在命令中使用文件描述符3了。例如:
    cat <&3 this is a test line
    如果要再次读取,我们就不能再继续使用文件描述符3了,而是需要用exec重新分配文件描述符3以便用于读取。

    如果 b.txt 文件有很多内容,而你想要清空的话,同样可以使用上面提到的命令形式:

    1)从路径中提出出文件名(带后缀),例子如下:

    17.  定义一个普通数组: array_var=(1 2 3 4 5)#这些值将会被存储在以0为起始索引的连续位置上
    将数组定义成一组索引: array_var[0]="test1" array_var[0]="test2" ...
    定义一个关联数组:(在关联数组中,我们可以用任意的文本作为数组索引。而在普通数组中,只能用整数作为数组索引)
    先声明:declare -A ass_array
    再定义:ass_array=([index1]=var1 [index2]=var2)
    列出数组索引:echo ${!array_var[*]}

    cat >b.txt << EOF
    >EOF
    

    图片 16

    18.  转义字符的特殊作用:

    5: cat命令可以直接向文件中写入东西,并覆盖掉原本的东西

    2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:

    在不信任的环境下执行特权命令,通过在命令前加上 来忽略可能存在的别名设置总是一个不错的安全实践。因为攻击者可能已经利用别名将某些特权命令替换成了一些别有用心的命令,借此来盗取用户输入的重要信息。

    cat >c.txt  <<EOF
    >2222
    >3333
    >EOF
    

    图片 17

    19.  任务前后台切换:
    1、command &  将任务切至后台,同时得到后台任务号和任务ID
    2、执行一个任务,Ctrl z 用来挂起任务,此时可以用'bg 任务号'来将任务切至后台,用'fg 任务号'来将任务切至前台

    利用cat命令处理的时候,尽量带上文件的格式,例如1.txt,1.doc

    2、dirname

    20.  定义一个新命令,用来结合其它几个命令(举个栗子):

    要是第一步,文件追加需要用到这个命令

    该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME

                      方法一、cmd=$(ls|cat -n)
            用反引号" ` "存储命令输出—>    方法二、cmd=`ls|cat -n`

    cat file1 >> file2
    

    使用例子如下:

    21.  括号()的特殊用法:

    二:获取一个目录下的文件名

    图片 18

    终端输入(命令):命令在子shell中执行时,不会影响当前shell的执行
    举个栗子: pwd;(cd /bin;ls);pwd    #pwd 显示当前所在目录
    扩展:可以通过子shell的方式保留空格和换行符

     获取目录下的文件名可以直接使用    ls   命令,但只是将名字打印出来,不能获得这个名字,也就是说如果想要在后面使用cat命令对这些文件进行处理的话,需要用一个变量来接收这些文件名,再对这个变量进行cat操作

    这样就提取出了file.txt文件所在的目录。

    22.  不显示输入密码

    下面介绍两种常用的方法来进行相关操作

    注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:

    #!/bin/sh
    #Filename: password.sh
    echo -e "Enter password: "
    stty -echo
    read password
    echo $password
    #stty echo
    #read password
    #echo $password
    其中,选项-echo禁止将输出发送到终端,而选项echo则允许发送输出。

    1:使用${ }

    图片 19

    23.  将多行文本内容输出为一行:

    ${var##*/} 

    它提取出了目录dir2所在的目录dir1.

         1、 cat example.txt(内含多行文本内容) | xargs
       用xargs还可将单行转为多行:cat example.txt | xargs -n 3 (3个字符为一行)
                 2、 echo $(example.txt)

    该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    23.  xargs -d

    使用例子及结果如下:

    您可能感兴趣的文章:

    • linux中快速列出文件列表的多种方法总结
    • linux 获取文件名称并生成列表txt的方法

    echo "splitXsplitXsplitXsplit" | xargs -d X
    split split split split
    在上面的代码中,stdin是一个包含了多个X字符的字符串。我们可以用 -d将X作为输入定界符。在这里,我们明确指定X作为输入定界符,而在默认情况下,xargs采用内部字段分隔符(IFS)作为输入定界符。 同时结合-n,我们可以将输入划分成多行,而每行包含两个参数:
    echo "splitXsplitXsplitXsplit" | xargs -d X -n 2
    split split
    split split

    ~$ var = /dir1/dir2/file.txt
    ~$ echo ${var##*/}
    file.txt
    

    24.  删除所有的.txt文件
    find . -type f -name "*.txt" -print0 | xargs -0 rm -f
    xargs -0将作为输入定界符。

    从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。

    25.  统计源代码目录中所有C程序文件的行数
    find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc -l

    若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file = ${var##*/}

    26.  删除除指定内容外的其它内容(即删除指定内容的补集)
    echo you 1 me 2 xiaoshagua 6|tr -d -c '0-9n'

    ${var##*.}

    1 2 6

    该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容

    27.  求给出文档中的所有数字的和:

    使用例子及结果如下:

    cat sum.txt | echo [ (tr 'n' ' ' ) 0 ]

    ~$ var = /dir1/dir2/file.txt
    ~$ echo ${var##*.}
    txt
    

    28.  将文件名从小写换为大写输出在终端上
    ls|tr [:lower:] [:upper:]

    从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。

    29.  sort -k 1.3,1.3 -rk 3,3 a3.txt     

    如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。

    按照每行的第三个字符开始排序,并结束于每行的第三个字符,同时逆序排序第三个域(即每行被空格分开的第三部分)

    ${var#*.}

    30.  sort a3.txt|uniq -s 2 -w 2    

    该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容

    跳过前两个字符,并忽略第二个字符之后的内容
    例:i am a good man
           i love you
    输出:iam a good man    按排序顺序输出,由于跳过前两个字符,并忽略第二个字符之后的内容,所以两行内容相等,输出排序在前的

    使用例子及结果如下:

    31.  查找每个字符出现的次数

    ~$ var = /dir1/dir2/file.tar.gz
    ~$ echo ${var#*.}
    tar.gz
    

    input="ahebhaaa"
    output=`echo $input | sed 's/[^n]/ & n/g' | sed '/^$ /d' | sort | uniq -c | tr -d 'n'`
    echo $output 

    从运行结果可以看到,使用该命令,可以提取出文件的多个后缀.

    32.  /tmp目录下创建临时文件名:

    ${var%/*}

    1、temp_file=$(tempfile)    2、temp_file="/tmp/file-$RANDOM"    3、temp_file="/tmp/var.$$"

    该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容

    33.  生成一个大小为100KB的测试文件(data.file):
    dd if=/dev/zero bs=100k count=1 of=data.file
         将文件分割成多个更小的文件:
    split -b 10k data.file

    使用例子及结果如下:

    34.  csplit server.log /SERVER/ -n 2 -s {*} -f server -b "d.log";rm server00.log
    □ /SERVER/ 用来匹配某一行,分割过程即从此处开始。
    □ /[REGEX]/ 表示文本样式。包括从当前行(第一行)直到(但不包括)包含“SERVER”的匹配行。
    □ {*} 表示根据匹配重复执行分割,直到文件末尾为止。可以用{整数}的形式来指定分割执行的次数。
    □ -s 使命令进入静默模式,不打印其他信息。
    □ -n 指定分割后的文件名后缀的数字个数,例如01、02、03等。
    □ -f 指定分割后的文件名前缀(在上面的例子中,server就是前缀)。
    □ -b 指定后缀格式。例如“% 02d.log”,类似于C语言中printf的参数格式。在这里文件名=前缀 后缀=server d.log。
    因为分割后的第一个文件没有任何内容(匹配的单词就位于文件的第一行中),所以我们删除了server00.log。

    ~$ var = /dir1/dir2/file.txt
    ~$ echo ${var%/*}
    /dir1/dir2
    

    35.  拆分形如"sample.jpg"格式的文件名和扩展名:

    使用该命令,可以提取出我们需要的文件所在的目录.

    file_jpg="sample.jpg"

    ${var%%.*}

    name= {file_jpg%.*}

    该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容

    extension={file_jpg#*.}  此处最好用##*.

    使用例子及结果如下:

    %.* 得到文件名          #*. 得到扩展名

    ~$ var = /dir1/dir2/file.txt
    ~$ echo ${var%%.*}
    /dir/dir/file
    

    36.  给文本内容每行末尾加一个定界符#

    当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。

    pass.sh
    echo $*'#'
    localhost@ubuntu:~/shell$ cat tess.txt | xargs -I {} ./pass.sh -p {} -I    #注意xargs -I是-I(i),不是-l(L),后面-I可以是随意的一个字母
    -p tes1 -I#
    -p tes2 -I#
    -p tes3 -I#

    ⑥总结${ }

    后续更新,敬请期待。。。

    ${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。

     

    看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。

    如果文章对你哪怕有一点点的帮助,麻烦点个推荐或者关注,支持一下创作者!万分感谢!

    #:表示从左边算起第一个

    %:表示从右边算起第一个

    ##:表示从左边算起最后一个

    %%:表示从右边算起最后一个

    换句话来说,#总是表示左边算起,%总是表示右边算起。

    *:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。

    例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

    看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。

    2:basename和dirname

    ${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。

    ①basename

    该命令的作用是从路径中提取出文件名,使用方法为:

    basename NAME [SUFFIX]
    

    1)从路径中提出出文件名(带后缀)

    例子如下:

    ~$ var = /dir1/dir2/file.txt
    ~$ echo $(basename $var)
    file.txt
    

    2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名

    例子如下:

    ~$ var = /dir1/dir2/file.txt
    ~$ echo $(basename $var.txt)
    file
    

    ②dirname

    该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME

    使用例子如下:

    ~$ var = /dir1/dir2/file.txt
    ~$ dirname $var
    /dir1/dir2
    

    这样就提取出了file.txt文件所在的目录。

    注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:

    ~$ var = /dir1/dir2/
    ~$ dirname $var
    /dir1
    

    它提取出了目录dir2所在的目录dir1

    三:shell脚本的实现

    为方便进行操作,我把shell脚本与待处理文件放在了同一文件夹下

    vi Additional_document.sh
    

    将下列代码输入:

    #这里是待处理文件的位置
    Folder_A="/home/liuyaanng/liu"   
    for file_a in ${Folder_A}/*
    do  
        temp_file=`basename $file_a`  
        cat a.txt >> $temp_file
        echo 'success'  
    done  
    

    保存退出后,要赋予shell脚本可执行权限,由于脚本与待处理文件在一个文件夹下,所以该脚本同样会被cat命令作用,为避免有东西再写入该脚本,要修改访问权限为只读

    chmod r x Additional_document.sh
    

    执行该程序即可

    ./Additional_document.sh
    

    有几个需要注意的问题:

    1:该脚本仅支持纯文本的追加,不支持诸如图片,表格等

    2:若处理windows系统下的word文件,打开文件是乱码,原因可能是你的linu系统下未安装对应的字体(并非未安装中文,是诸如宋体,楷体)

    3:txt格式与doc格式也可追加,但为避免出现格式问题,可提前进行转格式操作,再进行追加

    转格式为:

    unoconv -f doc a.txt
    

    unoconv存在于很多发行版的软件仓库中,也可通过其网站下载安装。

    以上,为在linux下的完整操作

    在我查阅大量资料的时候,发现两款在Windows下专门做批量处理文档的神器

    在下载的时候,某度的搜索结果捆绑了太多软件,一不小心来了个全家桶,所以我在这分享一下安全绿色无捆绑的资源(排除打广告嫌疑,只是推荐,逃ε=ε=ε=┏(゜ロ゜;)┛)

    一:word文档批处理大师   Batchword(付费版本,土豪推荐)

    图片 20

    链接: 密码:j7w1

     这个我找了很久,找不到万能的注册机,破解版的也尝试了,暂时没有找到能用的,有资源的请默默留下链接(^人^)

    word文档批量处理大师基本功能

      1、批量运行word宏代码:

      2、批量插入版权/随机文字、随机版权图片:

      3、批量添加文字超链接、替换文档内容

      4、批量格式设置:

      5、页面设置、属性设置

      6、替换/设置图片、超链接

      7、word转图片或PDF

      8、设置/清除文字页眉、图片页眉

      9、设置/清除文字页脚、图片页脚

      10、设置/清除文字水印、图片水印

      11、批量打印

      12、插入/合并文档

      13、转换类型(可转换为doc、rtf、txt、xml、htm、html、mht、mhtml、dot、docx、dotx中的任一格式)

      14、繁简转换

      15、设置、修改密码

     二:BatchDoc(功能较BatchWord少,也是需要注册)

    图片 21

    链接:; 密码:cbfo

    这个在万能的吾爱破解坛友的帮助下还是有道道哈哈哈,打开软件后输入传送门:HJG4567-AQsmVAo-8

     

    本文由新葡亰496net发布于电脑系统,转载请注明出处:领取文件名和目录名的有的主意总结,提取文件

    关键词:

上一篇:linuxvim命令集合,Vim命令合集

下一篇:没有了