一、寫在前面
前幾天在微信上看到這樣一篇文章,鏈接為:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在這篇文章中,有這樣一段話,吸引了我的注意:
? 在 Linux 中 ls 是一個使用頻率非常高的命令了,可選的參數(shù)也有很多, 算是一條不得不掌握的命令。Python 作為一門簡單易學(xué)的語言,被很多人認(rèn)為是不需要認(rèn)真學(xué)的,或者只是隨便調(diào)個庫就行了,那可就真是小瞧 Python 了。那這次我就要試著用 Python 來實現(xiàn)一下 Linux 中的 ls 命令, 小小地證明下 Python 的不簡單!
?
二、ls簡介
Linux ls 命令用于顯示指定工作目錄下的內(nèi)容。語法如下:
ls [-alkrt] [name]
這里只列舉了幾個常用的參數(shù),ls 命令的可選參數(shù)還是很多的,可以使用 man ls 來進(jìn)行查看具體信息。這里列出的幾個參數(shù)對應(yīng)含義如下:
1)-a:顯示所有文件及目錄;
2)-l:除文件名稱外,亦將文件大小、創(chuàng)建時間等信息列出;
3)-k:將文件大小以 KB 形式表示;
4)-r:將文件以相反次序排列;
5)-t:將文件以修改時間次序排列。
?
三、具體思路
主要使用的模塊是 argparse 和 os,其中 argparse 模塊能設(shè)置和接收命令行參數(shù),也就使得 Python 對命令行的操作變得簡單,而 os 模塊則用于文件操作,對 argparse 模塊不熟悉的可以在這里查看官方文檔。
既然要用 Python 實現(xiàn) ls.py, 也就要在命令行中進(jìn)行操作,比如 python ls.py -a 這樣的命令,而對 Python 比較熟悉的人可能會想到使用 sys 模塊來接收輸入的命令,但使用 argparse 能讓命令行操作變得更加簡單!首先要導(dǎo)入模塊并創(chuàng)建一個 ArgumentParser 對象,可以理解為一個解析器,然后就可以通過使用 add_argument() 方法為這個解析器添加參數(shù)了。示例如下:
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))
這段代碼的功能是輸入一到多個整數(shù),默認(rèn)求其中的最大值,若有 -min 參數(shù)則是求其中的最小值。可以看到在創(chuàng)建解析器和添加命令行參數(shù)的時候都設(shè)置了 description 描述信息,這個信息會在我們使用 --help 命令的時候顯示出來,例如:
在上面的代碼中,需要注意的是其中使用 add_argument() 添加了一個位置參數(shù) "integers" 和一個可選參數(shù) "-min",位置參數(shù)在命令行中必須存在,不可遺漏,也就不能設(shè)置 required 參數(shù)了,而可選參數(shù)就不是必須要有的了,因而還可以使用 default 參數(shù)設(shè)置默認(rèn)值。nargs 參數(shù)用于設(shè)置命令行參數(shù)的數(shù)量,"+" 表示一個或多個,"?" 表示零個或一個,這里由于輸入的數(shù)字可能有多個,所以要設(shè)置為 "+"。最終運(yùn)行示例如下:
> python test.py 1 3 5
Namespace(find_num=
, integers=[1, 3, 5])
5>?python test.py 1 3 5 -min
Namespace(find_num=
, integers=[1, 3, 5]) 1
關(guān)于 argparse 的介紹就到此為止了,下面簡單介紹下 os 模塊, os 模塊提供了便捷的使用操作系統(tǒng)相關(guān)功能的方式,實現(xiàn) ls.py 所用到的該模塊下的方法包括:
1)os.path.isdir(path):若 path 是一個存在的目錄,返回 True。
2)os.listdir(path):返回一個列表,其中包括 path 對應(yīng)的目錄下的內(nèi)容,不包含“.”和“..”,即使它們存在。
3)os.stat(path):獲取文件或文件描述符的狀態(tài),返回一個 stat_result 對象,其中包含了各種狀態(tài)信息。
?
四、主要代碼
? ls.py 中的主函數(shù)如下,主要功能為創(chuàng)建解析器,設(shè)置可選參數(shù)和位置參數(shù),然后接收命令行參數(shù)信息,并根據(jù)輸入的參數(shù)調(diào)用相應(yīng)的方法,這里設(shè)置了一個 "-V" 參數(shù)用于顯示版本信息,可以使用 "-V" 或者 "-Version" 進(jìn)行查看。
1
def
main():
2
"""
3
主函數(shù),設(shè)置和接收命令行參數(shù),并根據(jù)參數(shù)調(diào)用相應(yīng)方法
4
:return:
5
"""
6
#
創(chuàng)建解析器
7
parse = argparse.ArgumentParser(description=
"
Python_ls
"
)
8
#
可選參數(shù)
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
#
位置參數(shù)
16
parse.add_argument(
"
path
"
, type=str, help=
"
The path
"
, nargs=
"
?
"
)
17
18
#
命令行參數(shù)信息
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)
? 然后是一個獲取指定路徑下的內(nèi)容信息的函數(shù),要做的就是判斷路徑是否存在,若存在就返回一個文件列表,若不存在則顯示錯誤信息,并退出程序。
1
def
get_all(path):
2
"""
3
獲取指定路徑下的全部內(nèi)容
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()
?
五、運(yùn)行結(jié)果
下面是 ls.py 運(yùn)行后的部分結(jié)果截圖。
首先是 python ls.py -a,這里并沒有輸入路徑,就會使用默認(rèn)路徑即當(dāng)前目錄,如下圖:
然后是 python ls.py -a -t .,使用該命令會顯示當(dāng)前目錄下的所有內(nèi)容,并按照創(chuàng)建的時間進(jìn)行排序,如下圖:
最后是 python ls.py -a -l -k -r .,也是顯示當(dāng)前目錄下的所有內(nèi)容并按照創(chuàng)建名稱排序,不過這次文件大小會以 KB 為單位來顯示,如下圖:
? 到這里為止,ls.py 就算是基本實現(xiàn)了,當(dāng)然還是有很多可以去實現(xiàn)的功能的,比如更多的參數(shù)等等,如果你感興趣的話可以自己嘗試一下==
?
完整代碼已上傳到GitHub!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

