应用python编写shell脚本
2012-06-25 10:45
309 查看
python可以做shell脚本吗? 首先介绍一个函数:
这个函数可以调用shell运行命令行
shell中最常用的是ls命令,python对应的写法是:
就像这样,接下去所有命令都可以在python的解释器里直接运行观看结果。
对应于
不过,shell的
移动或者重命名文件和目录呢?估计被聪明的朋友猜到了,
把当前工作目录切换到dirname下
返回当前的工作目录路径
把dirname作为进程的根目录。和*nix下的
os.chmod(path,mode)
更改
具体它们是什么含义,就不仔细说了,基本上就是
改变文件的属主。uid和gid为-1的时候不改变原来的属主。
创建硬连接
创建目录。
和
返回path这个符号链接所指向的路径
删除文件,不能用于删除目录
删除文件夹,不能用于删除文件
创建符号链接
删除文件夹
介绍了这么多,其实只要查一下
环境变量。python的环境变量保存在
不过也要注意,环境变量的值只能是字符串。和shell有些不同的是,python没有
这个函数会把一个路径分离为两部分,比如:
这个函数会把目录名和文件名组合成一个完整的路径名,比如:os.path.join("/foo","bar.dat")会返回"/foo/bar.dat"。这个函数和os.path.split()刚好相反。
还有这些函数:
把path转成绝对路径
把path中包含的
os.path.expandvars(path)
根据环境变量的值替换path中包含的"$name"和"${name}",比如环境变量FISH=nothing,那os.path.expandvars("$FISH/abc")会返回"nothing/abc"
去掉path中包含的"."和".."
把path分离成基本名和扩展名。比如:
在
判断文件或者目录是否存在
判断path所指向的是否是一个普通文件,而不是目录
判断path所指向的是否是一个目录,而不是普通文件
判断path所指向的是否是一个符号链接
判断path所指向的是否是一个挂接点(mount point)
返回path所指向的文件或者目录的最后存取时间。
返回path所指向的文件或者目录的最后修改时间
返回path所指向的文件的创建时间
返回path所指向的文件的大小
应用python编写shell脚本经常要用到
不能光说不练,接下来我们就编写一个用于复制文件的简单脚本。前两天叫我写脚本的同事有个几万个文件的目录,他想复制这些文件到其它的目录,又不能直接复制目录本身。他试了一下
再试一下linuxapp版里的帖子——把一个文件夹下的所有文件重命名成
转载来源:http://besteam.im/blogs/article/23/。
os.system(command)
这个函数可以调用shell运行命令行
command并且返回它的返回值。试一下在python的解释器里输入
os.system("ls -l"),就可以看到
ls列出了当前目录下的文件。可以说,通过这个函数,python就拥有了shell的所有能力。呵呵。。不过,通常这条命令不需要用到。因为shell常用的那些命令在python中通常有对应而且同样简洁的写法。
shell中最常用的是ls命令,python对应的写法是:
os.listdir(dirname),这个函数返回字符串列表,里面是所有的文件名,不过不包含
.和
..。如果要遍历整个目录的话就会比较复杂一点。我们等下再说吧。先在解释器里试一下:
>>> os.listdir("/") ['tmp', 'misc', 'opt', 'root', '.autorelabel', 'sbin', 'srv', '.autofsck', 'mnt', 'usr', 'var', 'etc', 'selinux', 'lib', 'net', 'lost+found', 'sys', 'media', 'dev', 'proc', 'boot', 'home', 'bin']
就像这样,接下去所有命令都可以在python的解释器里直接运行观看结果。
对应于
cp命令的是:
shutil.copy(src,dest),这个函数有两个参数,参数
src是指源文件的名字,参数dest则是目标文件或者目标目录的名字。 如果
dest是一个目录名,就会在那个目录下创建一个相同名字的文件。与
shutil.copy函数相类似的是
shutil.copy2(src,dest),不过copy2`还会复制最后存取时间和最后更新时间。
不过,shell的
cp命令还可以复制目录,python的
shutil.copy却不行,第一个参数只能是一个文件。这怎么办?其实,python还有个
shutil.copytree(src, dst [,symlinks])。参数多了一个
symlinks,它是一个布尔值,如果是True的话就创建符号链接。
移动或者重命名文件和目录呢?估计被聪明的朋友猜到了,
shutil.move(src,dst),呵呵。。与
mv命令类似,如果
src和
dst在同一个文件系统上,
shutil.move只是简单改一下名字,如果src和dst在不同的文件系统上,
shutil.move会先把
src复制到
dst,然后删除
src文件。看到现在,大多数朋友应该已经对python的能力有点眉目了,接下来我就列个表,介绍一下其它的函数:
os.chdir(dirname)
把当前工作目录切换到dirname下
os.getcwd()
返回当前的工作目录路径
os.chroot(dirname)
把dirname作为进程的根目录。和*nix下的
chroot命令类似
os.chmod(path,mode)
更改
path的权限位。
mode可以是以下值(使用
or)的组合:
os.S_ISUID os.S_ISGID os.S_ENFMT os.S_ISVTX os.S_IREAD os.S_IWRITE os.S_IEXEC os.S_IRWXU os.S_IRUSR os.S_IWUSR os.S_IXUSR os.S_IRWXG os.S_IRGRP os.S_IWGRP os.S_IXGRP os.S_IRWXO os.S_IROTH os.S_IWOTH os.S_IXOTH
具体它们是什么含义,就不仔细说了,基本上就是
R代表读,
W代表写,
X代表执行权限。
USR代表用户,
GRP代表组,
OTH代表其它。
os.chown(path,uid,gid)
改变文件的属主。uid和gid为-1的时候不改变原来的属主。
os.link(src,dst)
创建硬连接
os.mkdir(path,[mode])
创建目录。
mode的意义参见
os.chmod(),默认是0777
os.makedirs(path,[mode])
和
os.mkdir()类似,不过会先创建不存在的父目录。
os.readlink(path)
返回path这个符号链接所指向的路径
os.remove(path)
删除文件,不能用于删除目录
os.rmdir(path)
删除文件夹,不能用于删除文件
os.symlink(src,dst)
创建符号链接
shutil.rmtree(path[,ignore_errors[,onerror]])
删除文件夹
介绍了这么多,其实只要查一下
os和
shutil两个模块的文档就有了,呵呵。。真正编写shell脚本的时候还需要注意:
环境变量。python的环境变量保存在
os.environ这个字典里,可以用普通字典的方法修改它,使用system启动其它程序的时候会自动被继承。比如:
os.environ["fish"]="nothing"
不过也要注意,环境变量的值只能是字符串。和shell有些不同的是,python没有
export环境变量这个概念。为什么没有呢?因为python没有必要有:-)
os.path这个模块里包含了很多关于路径名处理的函数。在shell里路径名处理好像不是很重要,但是在python里经常需要用到。最常用的两个是分离和合并目录名和文件名:
os.path.split(path) -> (dirname,basename)
这个函数会把一个路径分离为两部分,比如:
os.path.split("/foo/bar.dat")会返回
("/foo","bar.dat")
os.path.join(dirname,basename)
这个函数会把目录名和文件名组合成一个完整的路径名,比如:os.path.join("/foo","bar.dat")会返回"/foo/bar.dat"。这个函数和os.path.split()刚好相反。
还有这些函数:
os.path.abspath(path)
把path转成绝对路径
os.path.expanduser(path)
把path中包含的
"~"和
"~user"转换成用户目录
os.path.expandvars(path)
根据环境变量的值替换path中包含的"$name"和"${name}",比如环境变量FISH=nothing,那os.path.expandvars("$FISH/abc")会返回"nothing/abc"
os.path.normpath(path)
去掉path中包含的"."和".."
os.path.splitext(path)
把path分离成基本名和扩展名。比如:
os.path.splitext("/foo/bar.tar.bz2")返回
('/foo/bar.tar', '.bz2')。要注意它和
os.path.split()的区别
在
os模块有一个很好用的函数叫
os.stat()没有介绍,因为
os.path模块里包含了一组和它具有同样功能的函数,但是名字更好记一点。
os.path.exists(path)
判断文件或者目录是否存在
os.path.isfile(path)
判断path所指向的是否是一个普通文件,而不是目录
os.path.isdir(path)
判断path所指向的是否是一个目录,而不是普通文件
os.path.islink(path)
判断path所指向的是否是一个符号链接
os.path.ismount(path)
判断path所指向的是否是一个挂接点(mount point)
os.path.getatime(path)
返回path所指向的文件或者目录的最后存取时间。
os.path.getmtime(path)
返回path所指向的文件或者目录的最后修改时间
os.path.getctime(path)
返回path所指向的文件的创建时间
os.path.getsize(path)
返回path所指向的文件的大小
应用python编写shell脚本经常要用到
os,
shutil,
glob(正则表达式的文件名),
tempfile(临时文件),
pwd(操作
/etc/passwd文件),
grp(操作
/etc/group文件),
commands(取得一个命令的输出)。前面两个已经基本上介绍完了,后面几个很简单,看一下文档就可以了。
sys.argv是一个列表,保存了python程序的命令行参数。其中
sys.argv[0]是程序本身的名字。
不能光说不练,接下来我们就编写一个用于复制文件的简单脚本。前两天叫我写脚本的同事有个几万个文件的目录,他想复制这些文件到其它的目录,又不能直接复制目录本身。他试了一下
cp src/* dest/结果报了一个命令行太长的错误,让我帮他写一个脚本。操起python来:
import sys,os.path,shutil for f in os.listdir(sys.argv[1]): shutil.copy(os.path.join(sys.argv[1], f), sys.argv[2])
再试一下linuxapp版里的帖子——把一个文件夹下的所有文件重命名成
10001~10999。可以这样写:
import os.path,sys dirname=sys.argv[1] i=10001 for f in os.listdir(dirname): src=os.path.join(dirname,f) if os.path.isdir(src): continue os.rename(src,str(i)) i+=1
转载来源:http://besteam.im/blogs/article/23/。
相关文章推荐
- 应用python编写shell脚本
- 应用python编写shell脚本
- python编写shell脚本详细讲解
- python练习之安装,基础知识应用以及脚本编写
- 用Python编写shell脚本时经常使用的函数的介绍
- Python编写shell脚本中常用的文件介绍
- 使用python编写批量卸载android应用的脚本
- python编写脚本应用实例
- Linux下编写脚本Shell和Python的区别
- 使用python编写批量卸载手机中安装的android应用脚本
- 用shell脚本编写ssh直接修改目标服务器的密码以及ssh的应用
- 使用python编写脚本获取手机当前应用apk的信息
- 使用python编写脚本获取手机当前应用的信息
- 使用python编写脚本获取手机当前应用apk的信息
- 使用python编写批量卸载android应用的脚本
- Shell脚本编写与应用
- 使用python编写批量卸载手机中安装的android应用脚本
- python编写shell脚本详细讲解
- 配置Apache2.x 支持shell脚本和Python编写CGI程序+测试程序
- python编写shell脚本详细讲解