请选择 进入手机版 | 继续访问电脑版

[python] 基于python编写的shell脚本详细 讲解

[复制链接]
查看175 | 回复32 | 2021-9-13 14:29:25 | 显示全部楼层 |阅读模式

本日 同事叫我编写一个shell脚本。话说,固然 我受*nix的影响甚深,但是对于*nix 里到处 可见的sh脚本却是讨厌之极。为什么讨厌呢?起首 是由于 sh脚本那莫名其妙的语法,感觉就像随写随扔的程序,完全没有任何美感可言。其次是sh脚本的处理本领 还是比较弱的,在文本处理、XML处理还有网络编程方面,基本上都要借助于perl,awk等一堆程序。我对这些程序也是不大喜欢 的,何况 学习第三方软件总要时间,还不如都用python好了。

那,python可以做shell脚本吗? 起首 先容 一个函数:

  1. os.system(command)
复制代码

这个函数可以调用shell运行下令 行command并且返回它的返回值。试一下在 python的表明 器里输入os.system(”ls -l”),就可以看到”ls”列出了当前目次 下的文件。可以说,通过这个函数,python就拥有了shell的全部 本领 。呵呵。。不过,通常这条下令 不必要 用到。由于 shell常用的那些下令 在python中通常有对应而且同样简洁的写法。

shell中最常用的是ls下令 ,python对应的写法是:os.listdir(dirname),这个函数返回字符串列表,内里 是全部 的文件名,不过不包含”.”和”..”。假如 要遍历整个目次 的话就会比较复杂一点。我们等下再说吧。先在表明 器里试一下:

  1. >>> os.listdir(”/”)
  2. ['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的本领 有点端倪 了,接下来我就列个表,先容 一下别的 的函数:

  1. os.chdir(dirname)
复制代码

把当前工作目次 切换到dirname下

  1. os.getcwd()
复制代码

返回当前的工作目次 路径

  1. os.chroot(dirname)
复制代码

把dirname作为进程 的根目次 。和*nix下的chroot下令 雷同

  1. os.chmod(path,mode)
复制代码

更改path的权限位。mode可以是以下值(使用 or)的组合:

  1. os.S_ISUID
  2. os.S_ISGID
  3. os.S_ENFMT
  4. os.S_ISVTX
  5. os.S_IREAD
  6. os.S_IWRITE
  7. os.S_IEXEC
  8. os.S_IRWXU
  9. os.S_IRUSR
  10. os.S_IWUSR
  11. os.S_IXUSR
  12. os.S_IRWXG
  13. os.S_IRGRP
  14. os.S_IWGRP
  15. os.S_IXGRP
  16. os.S_IRWXO
  17. os.S_IROTH
  18. os.S_IWOTH
  19. os.S_IXOTH
复制代码

具体 它们是什么含义,就不过细 说了,基本上就是R代表读,W代表写,X代表实验 权限。USR 代表用户,GRP代表组,OTH代表别的 。

  1. os.chown(path,uid,gid)
复制代码

改变文件的属主。uid和gid为-1的时间 不改变原来的属主。

  1. os.link(src,dst)
复制代码

创建硬毗连

  1. os.mkdir(path,[mode])
复制代码

创建目次 。mode的意义参见os.chmod(),默认是0777

  1. os.makedirs(path,[mode])
复制代码

和os.mkdir()雷同 ,不过会先创建不存在的父目次 。

  1. os.readlink(path)
复制代码

返回path这个符号链接所指向的路径

  1. os.remove(path)
复制代码

删除文件,不能用于删除目次

  1. os.rmdir(path)
复制代码

删除文件夹,不能用于删除文件

  1. os.symlink(src,dst)
复制代码

创建符号链接

shutil.rmtree(path[,ignore_errors[,onerror]])

删除文件夹

先容 了这么多,着实 只要查一下os和shutil两个模块的文档就有了,呵呵。。真正编写 shell脚本的时间 还必要 留意 :

1.环境变量。python的环境变量保存在os.environ这个字典里,可以用平凡 字典的方法修改它,使用 system启动别的 程序的时间 会自动 被继承。比如:

os.environ[”fish”]=”nothing”
不过也要留意 ,环境变量的值只能是字符串。和shell有些不同的是,python没有 export环境变量这个概念。为什么没有呢?由于 python没有必要有:-)

2.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()刚好相反。

还有这些函数:

  1. os.path.abspath(path)
复制代码

把path转成绝对路径

  1. os.path.expanduser(path)
复制代码

把path中包含的”~”和”~user”转换成用户目次

  1. os.path.expandvars(path)
复制代码

根据环境变量的值更换 path中包含的”$name”和”${name}”,比如环境变量 FISH=nothing,那os.path.expandvars(”$FISH/abc”)会返回”nothing/abc”

  1. os.path.normpath(path)
复制代码

去掉path中包含的”.”和”..”

  1. os.path.splitext(path)
复制代码

把path分离成基本名和扩展名。比如:os.path.splitext(”/foo /bar.tar.bz2″)返回('/foo/bar.tar', ‘.bz2′)。要留意 它和os.path.split()的区别

3.在os模块有一个很好用的函数叫os.stat()没有先容 ,由于 os.path模块里包含了一组和它具有同样功能的函数,但是名字更好记一点。

  1. os.path.exists(path)
复制代码

判定 文件或者目次 是否存在

  1. os.path.isfile()
复制代码

判定 path所指向的是否是一个平凡 文件,而不是目次

  1. os.path.isdir(path)
复制代码

判定 path所指向的是否是一个目次 ,而不是平凡 文件

  1. os.path.islink(path)
复制代码

判定 path所指向的是否是一个符号链接

  1. os.path.ismount(path)
复制代码

判定 path所指向的是否是一个挂接点(mount point)

  1. os.path.getatime(path)
复制代码

返回path所指向的文件或者目次 的末了 存取时间。

  1. os.path.getmtime(path)
复制代码

返回path所指向的文件或者目次 的末了 修改时间

  1. os.path.getctime(path)
复制代码

返回path所指向的文件的创建时间

  1. os.path.getsize(path)
复制代码

返回path所指向的文件的大小

4.应用python编写shell脚本常常 要用到os,shutil,glob(正则表达式的文件名),tempfile(临时 文件),pwd(操作/etc/passwd文件),grp(操作/etc/group文件),commands(取得一个下令 的输出)。前面两个已经基本上先容 完了,后面几个很简单,看一下文档就可以了。

5.sys.argv是一个列表,保存了python程序的下令 行参数。此中 sys.argv[0]是程序本身的名字。
不能光说不练,接下来我们就编写一个用于复制文件的简单脚本。前两天叫我写脚本的同事有个几万个文件的目次 ,他想复制这些文件到别的 的目次 ,又不能直接复制目次 本身。他试了一下”cp src/* dest/”结果 报了一个下令 行太长的错误,让我帮他写一个脚本。操起python来:

  1. import sys,os.path,shutil
  2. for f in os.listdir(sys.argv[1]):
  3. shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2])
复制代码

再试一下linuxapp版里的帖子——把一个文件夹下的全部 文件重定名 成 10001~10999。可以如许 写:

  1. import os.path,sys
  2. dirname=sys.argv[1]
  3. i=10001
  4. for f in os.listdir(dirname):
  5. src=os.path.join(dirname,f)
  6. if os.path.isdir(src):
  7. continue
  8. os.rename(src,str(i))
  9. i =1
复制代码

os.chkdir(path) 转换到目次 path 下。

os.system('md a') 可以直接创建目次 。

os.name字符串指示你正在使用 的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。
● os.getcwd()函数得到当前工作目次 ,即当前Python脚本工作的目次 路径。
● os.getenv()和os.putenv()函数分别用来读取和设置环境变量。
● os.listdir()返回指定目次 下的全部 文件和目次 名。
● os.remove()函数用来删除一个文件。
● os.system()函数用来运行shell下令 。
● os.linesep字符串给出当前平台使用 的行停止 符。比方 ,Windows使用 '\r\n',Linux使用 '\n'而Mac使用 '\r'。
● os.path.split()函数返回一个路径的目次 名和文件名。
>>> os.path.split('/home/swaroop/byte/code/poem.txt')
('/home/swaroop/byte/code', 'poem.txt')
● os.path.isfile()和os.path.isdir()函数分别检验给出的路径是一个文件还是目次 。雷同 地,os.path.exists()函数用来检验给出的路径是否真地存在。

文件重定向

已有PY文件new1.py ,在下令 行下输入:new1>new.txt 可以将new1运行的结果 输出到文件new.txt,这称为流重定向。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 123457294 | 2021-9-13 18:45:16 | 显示全部楼层
楼上是GG还是MM啊?
回复

使用道具 举报

avatar 千无情实 | 2021-9-13 21:24:16 | 显示全部楼层
admin楼主很有经验啊!
回复

使用道具 举报

avatar 喜喜保镖撼 | 2021-9-18 13:21:43 | 显示全部楼层
今天不想骂人!
回复

使用道具 举报

avatar fdxhcwe148498 | 2021-9-23 13:32:04 | 显示全部楼层
帖子好乱!
回复

使用道具 举报

avatar 风来时狂放 | 2021-9-26 23:32:46 | 显示全部楼层
admin楼主病的不轻啊!
回复

使用道具 举报

avatar 俏蝶吹 | 2021-10-3 00:42:41 | 显示全部楼层
顶一下,收藏了!
回复

使用道具 举报

avatar Runlinh | 2021-10-3 19:18:13 | 显示全部楼层
突然觉得admin楼主说的很有道理,赞一个!
回复

使用道具 举报

avatar 缥缈的绽放山 | 2021-10-4 09:56:33 | 显示全部楼层
我只看看不说话。。。
回复

使用道具 举报

avatar 张小麦坡 | 2021-10-15 22:15:44 | 显示全部楼层
小弟默默的路过贵宝地~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则