-
[论坛] 跟我学之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
标题搜索
我的存档
数据统计
- 访问量: 1121
- 日志数: 11
- 图片数: 2
- 建立时间: 2006-01-10
- 更新时间: 2008-08-14
