Python學習之旅:使用Python實現Linux中的ls命令

  • 2019 年 10 月 3 日
  • 筆記

一、寫在前面

  前幾天在微信上看到這樣一篇文章,鏈接為:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在這篇文章中,有這樣一段話,吸引了我的注意:

  

   在 Linux 中 ls 是一個使用頻率非常高的命令了,可選的參數也有很多, 算是一條不得不掌握的命令。Python 作為一門簡單易學的語言,被很多人認為是不需要認真學的,或者只是隨便調個庫就行了,那可就真是小瞧 Python 了。那這次我就要試著用 Python 來實現一下 Linux 中的 ls 命令, 小小地證明下 Python 的不簡單!

 

二、ls簡介

  Linux ls 命令用於顯示指定工作目錄下的內容。語法如下:

ls [-alkrt] [name]

  這裡只列舉了幾個常用的參數,ls 命令的可選參數還是很多的,可以使用 man ls 來進行查看具體資訊。這裡列出的幾個參數對應含義如下:

  1)-a:顯示所有文件及目錄;

  2)-l:除文件名稱外,亦將文件大小、創建時間等資訊列出;

  3)-k:將文件大小以 KB 形式表示;

  4)-r:將文件以相反次序排列;

  5)-t:將文件以修改時間次序排列。

 

三、具體思路

  主要使用的模組是 argparse 和 os,其中 argparse 模組能設置和接收命令行參數,也就使得 Python 對命令行的操作變得簡單,而 os 模組則用於文件操作,對 argparse 模組不熟悉的可以在這裡查看官方文檔。

  既然要用 Python 實現 ls.py, 也就要在命令行中進行操作,比如 python ls.py -a 這樣的命令,而對 Python 比較熟悉的人可能會想到使用 sys 模組來接收輸入的命令,但使用 argparse 能讓命令行操作變得更加簡單!首先要導入模組並創建一個 ArgumentParser 對象,可以理解為一個解析器,然後就可以通過使用 add_argument() 方法為這個解析器添加參數了。示例如下:

 1 # test.py   2 import argparse   3   4 parser = argparse.ArgumentParser(description='Find the maximum number.')   5 parser.add_argument("integers", type=int, nargs="+", help="The input integers.")   6 parser.add_argument("-min", nargs="?", required=False, dest="find_num", default=max, const=min,   7                     help="Find the minimum number(Default: find the maximum number).")   8   9  10 args = parser.parse_args()  11 print(args)  12 print(args.find_num(args.Nums))

  這段程式碼的功能是輸入一到多個整數,默認求其中的最大值,若有 -min 參數則是求其中的最小值。可以看到在創建解析器和添加命令行參數的時候都設置了 description 描述資訊,這個資訊會在我們使用 –help 命令的時候顯示出來,例如:

  

  在上面的程式碼中,需要注意的是其中使用 add_argument() 添加了一個位置參數 “integers” 和一個可選參數 “-min”,位置參數在命令行中必須存在,不可遺漏,也就不能設置 required 參數了,而可選參數就不是必須要有的了,因而還可以使用 default 參數設置默認值。nargs 參數用於設置命令行參數的數量,”+” 表示一個或多個,”?” 表示零個或一個,這裡由於輸入的數字可能有多個,所以要設置為 “+”。最終運行示例如下:

> python test.py 1 3 5

Namespace(find_num=<built-in function max>, integers=[1, 3, 5])
5

> python test.py 1 3 5 -min

Namespace(find_num=<built-in function min>, integers=[1, 3, 5])

1

  關於 argparse 的介紹就到此為止了,下面簡單介紹下 os 模組, os 模組提供了便捷的使用作業系統相關功能的方式,實現 ls.py 所用到的該模組下的方法包括:

  1)os.path.isdir(path):若 path 是一個存在的目錄,返回 True。

  2)os.listdir(path):返回一個列表,其中包括 path 對應的目錄下的內容,不包含“.”和“..”,即使它們存在。

  3)os.stat(path):獲取文件或文件描述符的狀態,返回一個 stat_result 對象,其中包含了各種狀態資訊。

 

四、主要程式碼

   ls.py 中的主函數如下,主要功能為創建解析器,設置可選參數和位置參數,然後接收命令行參數資訊,並根據輸入的參數調用相應的方法,這裡設置了一個 “-V” 參數用於顯示版本資訊,可以使用 “-V” 或者 “-Version” 進行查看。

 1 def main():   2     """   3     主函數,設置和接收命令行參數,並根據參數調用相應方法   4     :return:   5     """   6     # 創建解析器   7     parse = argparse.ArgumentParser(description="Python_ls")   8     # 可選參數   9     parse.add_argument("-a", "-all", help="Show all files", action="store_true", required=False)  10     parse.add_argument("-l", "-long", help="View in long format", action="store_true", required=False)  11     parse.add_argument("-k", help="Expressed in bytes", action="store_true", required=False)  12     parse.add_argument("-r", "-reverse", help="In reverse order", action="store_true", required=False)  13     parse.add_argument("-t", help="Sort by modified time", action="store_true", required=False)  14     parse.add_argument("-V", "-Version", help="Get the version", action="store_true", required=False)  15     # 位置參數  16     parse.add_argument("path", type=str, help="The path", nargs="?")  17  18     # 命令行參數資訊  19     data = vars(parse.parse_args())  20     assert type(data) == dict  21     if data["V"]:  22         print("Python_ls version: 1.0")  23         return  24     else:  25         check_arg(data)

   然後是一個獲取指定路徑下的內容資訊的函數,要做的就是判斷路徑是否存在,若存在就返回一個文件列表,若不存在則顯示錯誤資訊,並退出程式。

 1 def get_all(path):   2     """   3     獲取指定路徑下的全部內容   4     :param path: 路徑   5     :return:   6     """   7     if os.path.isdir(path):   8         files = [".", ".."] + os.listdir(path)   9         return files  10     else:  11         print("No such file or directory")  12         exit()

 

五、運行結果

  下面是 ls.py 運行後的部分結果截圖。

  首先是 python ls.py -a,這裡並沒有輸入路徑,就會使用默認路徑即當前目錄,如下圖:

  

  然後是 python ls.py -a -t .,使用該命令會顯示當前目錄下的所有內容,並按照創建的時間進行排序,如下圖:

  

  最後是 python ls.py -a -l -k -r .,也是顯示當前目錄下的所有內容並按照創建名稱排序,不過這次文件大小會以 KB 為單位來顯示,如下圖:

  

   到這裡為止,ls.py 就算是基本實現了,當然還是有很多可以去實現的功能的,比如更多的參數等等,如果你感興趣的話可以自己嘗試一下==

 

  完整程式碼已上傳到GitHub