发布新日志

  • [论坛] 跟我学之Linux Shell 第4天 文件名匹配

    2008-08-14 15:34:14

    第4天 文件名匹配
    我们在使用命令时,很多情况下其操作对象是文件名符合某种模式规则的文件。
    如:
       匹配文件名中的任何字符串
       匹配文件名中的单个字符
       匹配文件命中的字母或数字

    下面我们就来学习这些字符串模式匹配规则。
    1、使用“ * ”
    使用星号“ * ”可以匹配文件名中的任何字符串。
    例:
        $ls mk*
            /bin/mkdir  /bin/mknod  /bin/mktemp

    给出的文件名匹配模式是mk*,把*放在文件末尾,意思是文件名以mk开头,后面可以跟随任何字符串,包括空字符串。

        $ls *.png
        gnome-about-logo.png             im-chooser.png
        gnome-aorta.png                  invest-big.png
    给出的文件名匹配模式*.png,把*放在开头,意思是匹配所有以 .png 结尾的文件。

        $ls me*.jpg
        medium.jpg
    给出的文件名匹配模式me*.jpg,把*放在中间,意思是匹配所有以me开头,.jpg结尾,中间可以是任何字符串的文件。

    在使用 cd 命令切换路径时,也使用星号,这样可以省去输入整个路径名的麻烦,大家可以尝试一下哦。

    2、使用“ ? ”
    使用问号“ ? ”可以匹配文件名中的单个字符。
    例:
        $ls /bin/?a*
        /bin/basename  /bin/cat   /bin/false  /bin/mail  /bin/tar
        /bin/bash      /bin/date  /bin/gawk   /bin/raw   /bin/taskset


        $ls /bin/ch???
        /bin/chgrp  /bin/chmod  /bin/chown


        $ls /bin/d??e
        /bin/date


    3、使用[...]和[!...]
    使用 [...] 可以用来匹配方括号 [ ] 中的任何字符。在这一方法中,还可以使用一个横杠 -来连

    接两个字母或数字,以此来表示一个范围。
    例:
        $ls /bin/[ck]*
        /bin/cat    /bin/chmod  /bin/cp    /bin/csh  /bin/kbd_mode  /bin/ksh
        /bin/chgrp  /bin/chown  /bin/cpio  /bin/cut  /bin/kill
    列出以 c或k开头的文件名

        $ls /etc/[a-n]*.conf
        /etc/autofs_ldap_auth.conf  /etc/idmapd.conf    /etc/logrotate.conf
        /etc/cdrecord.conf          /etc/initlog.conf   /etc/mke2fs.conf
        /etc/conman.conf            /etc/jwhois.conf    /etc/modprobe.conf
        /etc/dhcp6c.conf            /etc/kdump.conf     /etc/mtools.conf
        /etc/dhcpd.conf             /etc/krb5.conf      /etc/multipath.conf
        /etc/esd.conf               /etc/ldap.conf      /etc/nscd.conf
        /etc/gpm-root.conf          /etc/ld.so.conf     /etc/nsswitch.conf
        /etc/grub.conf              /etc/lftp.conf      /etc/ntp.conf
        /etc/gssapi_mech.conf       /etc/libaudit.conf
        /etc/host.conf              /etc/libuser.conf
    列出/etc/目录中以字母a到n开头的,并且以.conf结尾的文件

        $ls /etc/[!a-n]*.conf
        /etc/oddjobd.conf       /etc/sestatus.conf   /etc/wvdial.conf
        /etc/pam_smb.conf       /etc/smartd.conf     /etc/xinetd.conf
        /etc/prelink.conf       /etc/smi.conf        /etc/yum.conf
        /etc/prozilla.conf      /etc/sysctl.conf     /etc/yumex.conf
        /etc/reader.conf        /etc/syslog.conf     /etc/yumex.profiles.conf
        /etc/resolv.conf        /etc/updatedb.conf
        /etc/scrollkeeper.conf  /etc/warnquota.conf

    列出/etc/目录中不是以字母a到n开头的,并且以.conf结尾的文件,其中 ! 是非的意思


    为了列出所有以大写字母开头的文件名,怎么用?
    为了列出所有以数字开头的文件名,怎么用?
  • [论坛] 跟我学之Linux Shell 第3天 使用find命令

    2008-08-13 16:07:33

    第3天 使用find命令
    我们经常会在系统中查找具有某一特征的文件,如:特定权限的文件、属于某个用户的文件、特定大小的文件等。find命令是一个非常有效的查找工具,它可以遍历当前目录或整个文件系统来查找某些文件或目录。
    find命令的一般格式:
        find pathname -options [-exec]
        pathname  是find命令所查找的目录路径
        -exec     对匹配的文件执行该参数所给出的shell命令
       
    -options 选项参数:
        -name 按照文件名查找文件
        -perm 按照文件权限来查找文件
        -user 按照文件属主来查找文件
        -group 按照文件所属组来查找文件
        -mtime -n +n 按照文件的更改时间来查找文件,-n 表示n天以内,+n 表示n天前
        -nogroup 查找无属组的文件
        -nouser 查找无属主的文件
        -type 查找某一类型的文件:
              b 块设备文件
              d 目录
              c 字符设备文件
              p 管道文件
              l 符号链接文件
              f 普通文件

    1、使用-name选项
    该选项是我们的常用选项,通常使用某种文件名模式来匹配文件。
    例:(1)在用户主目录下查找所有“.txt”文件
         $find ~ -name “*.txt”
        (2)在当前目录及子目录下查找所有“.log”文件
         $find . -name “*.log”
        (3)在当前目录及子目录下查找所有以大写字母开头的文件
         $find . -name “[A-Z]*”
        (4)查找/etc目录下以“host”开头的文件
         $find /etc -name “host*”

    2、使用-perm选现
    该选项用来查找那些指定权限的文件
    例:查找当前目录及子目录下所有文件权限为755的文件
        $find . -perm 755

    3、使用-user或-nouser选项
    按照文件属主来查找文件
    例:(1)在用户目录下查找文件属主为root的文件
         $find ~ -user root
        (2)查找/home目录下那些没有属主的文件
         $find /home -nouser

    4、使用-group或-nogroup选项
    用法同-user或-nouser,不再讲解

    5、使用-mtime选项
    按照文件的修改时间来查找
    例:(1)在用户主目录下查找2天内修改过的文件
          $find ~ -mtime -2
        (2)在/var/www中查找10天前修改过的文件
          $find /var/www -mtime +10

    6、使用exec来执行shell命令
    当找到匹配的文件时,我们还希望对其进行某种操作,这时就可以使用-exec选项。
    格式要求:
    -exec 选项后面跟随着所要执行的命令,然后是一对{}一个空格和一个\,最后是一个分号。

    例:在用户主目录下查找修改时间在30天的“.txt”文件并删除之
        $find ~ -type f -mtime +30 -name “*.txt” -exec rm {} \;
  • [论坛] 跟我学之Linux Shell 第2天 文件权限的修改

    2008-08-12 11:31:47

    第2天 文件权限的修改
    昨天学习了文件的权限,今天我们学习如何修改文件的权限。
    对于属于你自己的文件,可以按照自己的需要改变其权限位。(由于每个文件都有一个属主及用户组,最好能够先学习一下用户与用户组方面的知识,用户与用户组的知识我们会另外开辟专题进行学习。)
    修改文件权限位使用chmod命令,chmod使用时有2种方式,一种称为符号模式,另一种称为绝对模式。
    1、符号模式修改文件权限
    chmod命令格式:
        chmod [ugoa...][[+-=][perms...]...] FILE...

        u  表示属主(user)
        g  表示用户组(group)
        o  表示其他用户(other)
        a  表示所有用户(all)

        +  表示增加权限
        -  表示去掉权限
        =  表示设定权限(即不管原先是什么权限都设定为指定的权限)

        权限: r w x

        FILE是要设置权限的文件

    例:
    omak@welix:/home/work$ touch myfile

    omak@welix:/home/work$ ls -lh

    总用量 0

    -rw-r--r-- 1 omak omak 0 2008-08-12 10:45 myfile

    可以看到myfile的原始权限是“rw-r--r--”
    下面为组用户增加写权限“w”
    omak@welix:/home/work$ chmod g+w myfile

    omak@welix:/home/work$ ls -lh

    总用量 0

    -rw-rw-r-- 1 omak omak 0 2008-08-12 10:45 myfile

    可以看到myfile的权限变为“rw-rw-r--”,显然,组用户有了“w”权限。
    若myfile是个脚本文件,现要为其设置为所有用户都可执行权限,但不改变其他权限,该怎么办呢?
    omak@welix:/home/work$ chmod a+x myfile

    omak@welix:/home/work$ ls -lh

    总用量 0

    -rwxrwxr-x 1 omak omak 0 2008-08-12 10:45 myfile

    显然,使用了“a+x”,所有用户都增加“x”权限。
    若现在要把myfile设置成任何用户都只有“读”权限,怎么办呢?
    omak@welix:/home/work$ chmod a=r myfile

    omak@welix:/home/work$ ls -lh

    总用量 0

    -r--r--r-- 1 omak omak 0 2008-08-12 10:45 myfile

    显然,使用“a=r”,所有用户都置为“读”权限,而其他权限都被去掉。

    2、绝对模式修改文件权限
    chmod命令格式:
        chmod [mode] FILE...

        其中,mode是一个八进制的数,该数由具体的“rwx-”字符对应的数字计算得到。
        r  的值为 4
        w  的值为 2
        x  的值为 1
        -  的值为 0
        “属主”、“用户组”、“其他用户”,3者的权限仍然分各自独立的1个值。

    如,对文件myfile
    -r--r--r-- 1 omak omak 0 2008-08-12 10:45 myfile

    其权限的八进制值为444
    那么-rwxrwxr-x 1 omak omak 0 2008-08-12 10:45 myfile
    其权限的值就为775


    例:
    omak@welix:/home/work$ chmod 777 myfile

    omak@welix:/home/work$ ls -lh

    总用量 0

    -rwxrwxrwx 1 omak omak 0 2008-08-12 10:45 myfile


    omak@welix:/home/work$ chmod 664 myfile

    omak@welix:/home/work$ ls -lh

    总用量 0

    -rw-rw-r-- 1 omak omak 0 2008-08-12 10:45 myfile

    omak@welix:/home/work$ chmod 754 myfile

    omak@welix:/home/work$ ls -lh

    总用量 0

    -rwxr-xr-- 1 omak omak 0 2008-08-12 10:45 myfile
  • [论坛] 跟我学之Linux Shell 第1天 文件权限

    2008-08-11 16:08:29

    第1天 文件权限
    1、文件
    使用ls -l命令来查看当前目录:
    omak@welix:~/MyDownloads$ ls -lh
    总用量 3.3M
    -rw-r--r-- 1 omak omak  15K 2008-05-29 20:34 81420-givemefoot.tar.gz
    drwxrwxr-x 2 omak omak 4.0K 2008-07-02 09:11 Dream ogg
    -rw-r--r-- 1 omak omak 222K 2008-08-01 20:56 git-tutor.pdf
    -rw-r--r-- 1 omak omak 3.0M 2008-08-05 12:06 phpMyAdmin-2.11.8.1-all-languages.tar.bz2
    -rwxr-xr-x 1 root root   72 2008-08-11 13:48 start.sh

    可以看到哪些信息呢:
    第1行“总用量 3.3M” ,告诉我们该目录中所有文件所占的空间。
    第2行直到最后一行是文件信息,每行都有8列信息(下面解释第2行的每一列):
    第1列“-rw-r—r--”: 总共是10位,告诉我们该文件的类型及权限,其中第1位是文件类型,2-10位是文件权限。
    第2列“1”:表示该文件的硬连接数。
    第3列“omak”:表示该文件的属主(即该文件是谁拥有所有权)。
    第4列“omak”:表示该文件的属组(即该文件还属于哪一用户组)。
    第5列“15k”:表示该文件的大小。
    第6列“2008-05-29”:表示文件更新的日期。
    第7列“20:34”:表示文件更新的时间。
    第8列“81420-givemefoot.tar.gz ”:是文件名。

    2、文件类型
    前面我们已经提及ls -lh命令查看到的文件信息,其中第1列中的第1位表示文件类型,用一个小写字母来表示。
    文件类型有7种:
        b 表示块设备(如硬盘、U盘);
        c 表示字符设备(如键盘);
        d 表示目录;
        l 表示符号链接(指向另一个文件);
        p 表示命名管道文件;
        s 表示套接字文件;
        - 表示不同文件,即不属于上述几种类型的文件。

    3、权限
    前面提及ls -lh命令查看到的文件信息,其中第1列中的第2-10位,共9位表示文件的权限。我们把这9位分为3段,每段3位,那么第1段表示文件属主的权限,第2段表示组用户的权限,第3段表示其他用户的权限。每段的每一位称为权限位,3个权限位分别用3个字母表示r、w、x。
    r表示文件可读,w表示文件可写、x表示文件可执行(对于目录而言表示可以进入该目录),若相应权限位没有权限,则用字符“-”表示。
    例如:
    drwxrwxr-x 2 omak omak 4.0K 2008-07-02 09:11 Dream ogg
    -rw-r--r-- 1 omak omak 222K 2008-08-01 20:56 git-tutor.pdf
    -rwxr-xr-x 1 root root   72 2008-08-11 13:48 start.sh
    “Dream ogg”是一个目录,其权限是omak用户可读可写可进入,omak组用户也是可读可写可进行入,而其他用户可读可进入,但不可写;
    “git-tutor.pdf”是一个普通文件,其权限是omak用户可读可写不可执行,omak组用户只可读,其他用护也只读;
    “tart.sh”是一个普通文件,其权限是root用户可读可写可执行,root组用户可读可执行,其他用户也是可读可执行。
  • [论坛] DOS文件转换成UNIX文件格式

    2008-05-26 00:09:07

    dos格式文件传输到unix系统时,会在每行的结尾多一个^M,当然也有可能看不到,但是在vi的时候,会在下面显示此文件的格式,比如 “dos.txt” [dos] 120L, 2532C 字样,表示是一个[dos]格式文件,如果是MAC系统的,会显示[MAC],因为文件格式的原因有时会导致我们的unix程序,或者shell程序出现错误,那么需要把这些dos文件格式转换成unix格式,方法是

    vi dos.txt
    :set fileformat=unix
    :w

      这样文件就转换成unix格式文件了, 一般在windows机器上编写好了文件传到unix下就可能会出现这样的情况.

      用命令:set ff?
      可以看到dos或unix的字样.
      用:set ff=unix把它强制为unix格式

      也可以用sed 这样的工具来做:

      sed ’s/^M//’ filename > tmp_filename

      其中^M是同时Ctrl+V+M按出来的,表示回车。
  • [论坛] 修改照片文件名为EXIF日期时间的脚本

    2008-05-26 00:07:21

    #!/bin/bash
    #
    # wmdd - Weapon of Mass Duplicate Detection
    #
    # I wrote this because I was having a hard time identifying duplicate
    # images in my f-spot Photos folder. I decided I should just rename all
    # of the pictures based on the EXIF data to YYYY-MM-DD-HH-mm-SS.jpg format.
    # If pictures have identical EXIF data, then '_copy' is added to the file
    # name. Operation is recursive.
    #
    # To make it a little easier, I have the scrīpt copy pictures to a folder,
    # 'exif/YYYY' or 'noexif' depending on whether there is EXIF info or not.
    # This also make reimporting to f-spot a little easier.
    #
    # Requires exif package.
    #
    # To run, cd to the top-level directory of the images you want to rename.
    #
    # Todd Slater
    # 14 May 2007

    original_pic_dir=`pwd` # maybe at some point make this an optional argument
    cp_dir="$original_pic_dir/exif"
    noexif_dir="$original_pic_dir/noexif"
    # find images
    find $original_pic_dir -type f -iname '*.jpg' >> piclist
    while read line
    do
    # test for exif
    if [ -z `exif -t DateTimeOriginal "$line"` >/dev/null 2>&1 ] ; then
    # no exif, let's copy it to noexif_dir, but not overwrite existing files
    pic_name=`echo "$line" |sed s/" "/_/g | xargs basename`
    while [ -f "$noexif_dir/$pic_name" ] ;
    do
    pic_name=`echo "$pic_name" | sed s/\.jpg/_copy\.jpg/`
    done
    if [ ! -d $noexif_dir ] ; then
    mkdir -p $noexif_dir
    fi
    cp "$line" "$noexif_dir/$pic_name"
    else
    # has exif, let's rename and copy to exif/YYYY folder
    exif -t DateTimeOriginal "$line" |grep Value > exif.$$
    year=`cut -b 10-13 "exif.$$"`
    month=`cut -b 15-16 "exif.$$"`
    day=`cut -b 18-19 "exif.$$"`
    hour=`cut -b 21-22 "exif.$$"`
    minute=`cut -b 24-25 "exif.$$"`
    second=`cut -b 27-28 "exif.$$"`
    rm exif.$$
    exif_name="$year-$month-$day-$hour-$minute-$second.jpg"
    while [ -f "$cp_dir/$year/$exif_name" ] ;
    do
    exif_name=`echo $exif_name | sed s/\.jpg/_copy\.jpg/`
    done
    if [ ! -d "$cp_dir/$year" ] ; then
    mkdir -p "$cp_dir/$year"
    fi
    cp "$line" "$cp_dir/$year/$exif_name"
    fi
    done < piclist
    rm -f piclist
Open Toolbar