python編寫shell腳本詳細講解

python編寫shell腳本詳細講解

 

那,python能夠作shell腳本嗎? 首先介紹一個函數:python


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腳本的時候還須要注意:

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()恰好相反。

還有這些函數:

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()的區別

3.在os模塊有一個很好用的函數叫os.stat()沒有介紹,由於os.path模塊裏包含了一組和它具備一樣功能的函數,可是名字更好記一點。

os.path.exists(path)
判斷文件或者目錄是否存在

os.path.isfile(
判斷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所指向的文件的大小

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來:
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))linux

i =1正則表達式

 

 

os.chkdir(path)  轉換到目錄path 下。shell

os.system('md a')  能夠直接建立目錄。app

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()函數用來檢驗給出的路徑是否真地存在。函數

 文件重定向oop

       已有PY文件new1.py ,在命令行下輸入:new1>new.txt 能夠將new1運行的結果輸出到文件new.txt,這稱爲流重定向。ui

 

本文轉載自:https://blog.csdn.net/u010786109/article/details/42361971spa

相關文章
相關標籤/搜索