基于Python實現(xiàn)一個Windows Tree命令工具
引言
今天想要在Windows平臺的CMD命令終端窗口中使用像Linux下的tree命令,打印一下目錄結(jié)構(gòu)層級樹。然而還真有tree命令,但是發(fā)現(xiàn)似乎并不好用,支持的參數(shù)很少,比如基本的-l 指定打印層級的參數(shù)也不支持。
tree 命令格式和參數(shù):
tree[drive:][path] [/F] [/A]
- /F 顯示每個文件夾中文件的名稱。(帶擴展名)
- /A 使用 ASCII 字符,而不使用擴展字符。(如果要顯示中文,例如 tree /f /A >tree.txt)
于是就想著使用Python簡單實現(xiàn)一個。
實現(xiàn)代碼
import os
import argparse
from collections import deque
def tree(directory, max_level=None, show_files=True, skip_names=None, current_level=0, prefix=''):
"""
遞歸生成目錄樹結(jié)構(gòu)
:param directory: 要顯示的目錄路徑
:param max_level: 最大顯示層級,None表示不限制
:param show_files: 是否顯示文件
:param skip_names: 要跳過的目錄或文件名列表
:param current_level: 當(dāng)前層級(內(nèi)部遞歸使用)
:param prefix: 前綴字符串(內(nèi)部遞歸使用)
:return: None
"""
if max_level is not None and current_level > max_level:
return
# 獲取目錄下的所有條目并排序
try:
entries = os.listdir(directory)
except PermissionError:
print(prefix + "└── [Permission Denied]")
return
entries = sorted(entries, key=lambda x: x.lower())
# 過濾出目錄和文件,并跳過指定名稱
dirs = []
files = []
for entry in entries:
if skip_names and entry in skip_names:
continue
entry_path = os.path.join(directory, entry)
if os.path.isdir(entry_path):
dirs.append(entry)
elif show_files:
files.append(entry)
all_entries = dirs + files
entries_count = len(all_entries)
for i, entry in enumerate(all_entries):
is_last = i == entries_count - 1
entry_path = os.path.join(directory, entry)
# 當(dāng)前條目的前綴
if is_last:
connector = "└── "
new_prefix = prefix + " "
else:
connector = "├── "
new_prefix = prefix + "│ "
print(prefix + connector + entry)
# 如果是目錄,遞歸顯示
if os.path.isdir(entry_path):
tree(entry_path, max_level, show_files, skip_names, current_level + 1, new_prefix)
def main():
# 設(shè)置命令行參數(shù)解析
parser = argparse.ArgumentParser(description='顯示目錄樹結(jié)構(gòu),類似Linux的tree命令')
parser.add_argument('directory', nargs='?', default='.', help='要顯示的目錄(默認(rèn)為當(dāng)前目錄)')
parser.add_argument('-l', '--level', type=int, help='限制顯示的目錄層級深度')
parser.add_argument('-f', '--files', action='store_true', help='同時顯示文件')
parser.add_argument('-s', '--skip', action='append', help='要跳過的目錄或文件名(可多次使用)')
args = parser.parse_args()
# 檢查目錄是否存在
if not os.path.isdir(args.directory):
print(f"錯誤: 目錄 '{args.directory}' 不存在")
return
# 顯示目錄樹
print(args.directory)
tree(args.directory, args.level, args.files, args.skip)
if __name__ == '__main__':
main()
使用說明
- 將上述代碼保存為
tree.py - 通過命令行運行:
python tree.py [目錄路徑] [選項]
:warning: 需要注意的是,前提是你的電腦環(huán)境需要安裝Python解釋器。
可用選項
-l LEVEL或--level LEVEL: 限制顯示的目錄層級深度-f或--files: 同時顯示文件(默認(rèn)只顯示目錄)-s或--skip參數(shù),可以指定要跳過的目錄或文件名- 該參數(shù)可以多次使用,跳過多個名稱
- 跳過規(guī)則同時適用于目錄和文件(如果
-f參數(shù)啟用)
示例用法
顯示當(dāng)前目錄樹結(jié)構(gòu)(只顯示目錄):
python tree.py
顯示指定目錄的樹結(jié)構(gòu)(顯示文件和目錄):
python tree.py C:\Users -f
顯示當(dāng)前目錄的2層深度:
python tree.py -l 2
顯示指定目錄的3層深度并包含文件:
python tree.py C:\Projects -l 3 -f
跳過 node_modules 目錄:
python tree.py -s node_modules
跳過多個目錄/文件:
python tree.py -s node_modules -s .git -s .DS_Store
組合使用多個參數(shù):
python tree.py C:\Projects -l 3 -f -s bin -s obj -s test
功能特點
- 支持類似Linux的tree命令輸出格式
- 支持限制顯示層級深度(-l參數(shù))
- 可選擇是否顯示文件(-f參數(shù))
- 正確處理權(quán)限問題(遇到無權(quán)限訪問的目錄會標(biāo)注)
- 輸出結(jié)果按字母順序排序
- 美觀的樹形結(jié)構(gòu)顯示
這個工具在Windows平臺上提供了類似Linux tree命令的功能,可以根據(jù)需要顯示目錄結(jié)構(gòu),并且通過-l參數(shù)可以限制顯示的層級深度等。
添加到環(huán)境變量
通過以上代碼我們就可以實現(xiàn)了一個基本的tree命令工具,但是在Windows平臺上的cmd控制臺中使用時,每次都需要python tree.py這樣使用也太麻煩了吧,可不可以像在Linux那樣直接就可以使用tree命令呢?當(dāng)然!
要將Python tree腳本添加到環(huán)境變量中,使其可以在任何目錄下直接通過tree命令調(diào)用,需要完成以下幾個步驟:
方法一:創(chuàng)建批處理文件并添加到PATH
1. 創(chuàng)建批處理文件
- 創(chuàng)建一個新的文本文件,命名為
tree.bat - 編輯內(nèi)容如下(根據(jù)你的Python安裝路徑調(diào)整):
@echo off python "C:\path\to\your\tree.py" %*
或者如果你想要確保使用特定的Python解釋器:
@echo off "C:\Python39\python.exe" "C:\path\to\your\tree.py" %*
%*表示傳遞所有參數(shù)給Python腳本
2. 將批處理文件放入系統(tǒng)目錄
將tree.bat文件放入以下任一目錄:
C:\Windows\System32(需要管理員權(quán)限)C:\Windows(需要管理員權(quán)限)- 或者任何已在PATH環(huán)境變量中的目錄
3. 或者添加到PATH環(huán)境變量
如果你不想放入系統(tǒng)目錄,可以:
- 創(chuàng)建一個專用目錄存放你的自定義腳本(如
C:\MyScripts) - 將此目錄添加到PATH環(huán)境變量中:
- 右鍵"此電腦" → 屬性 → 高級系統(tǒng)設(shè)置 → 環(huán)境變量
- 在"系統(tǒng)變量"部分找到"Path",點擊編輯
- 點擊"新建",添加你的目錄路徑(如
C:\MyScripts) - 點擊確定保存所有對話框
方法二:直接創(chuàng)建可執(zhí)行文件(推薦)
1. 使用PyInstaller打包成exe
安裝PyInstaller:
pip install pyinstaller
打包你的腳本:
pyinstaller --onefile --name mtree.exe tree.py
打包完成后,在dist目錄下會生成mtree.exe文件
2. 將exe文件放入PATH目錄
將生成的mtree.exe文件放入:
C:\Windows\System32- 或任何已在PATH環(huán)境變量中的目錄
方法三:創(chuàng)建Python包并安裝(高級)
1. 添加shebang和設(shè)置可執(zhí)行權(quán)限
- 在
tree.py文件開頭添加shebang行:
#!/usr/bin/env python
- 將文件重命名為
tree(無擴展名) - 將文件放入PATH目錄中
2. 或者創(chuàng)建setup.py安裝為Python包
創(chuàng)建setup.py文件:
from setuptools import setup
setup(
name='tree-cmd',
version='1.0',
scripts=['tree.py'],
)
安裝:
pip install --editable .
驗證安裝
:tipping_hand_man: 需要說明的是,我僅嘗試使用了方法二直接創(chuàng)建可執(zhí)行文件的方式,并且測試可行,其它方式有興趣的你可以試試。
- 打開新的命令提示符窗口(重要,使環(huán)境變量生效)
- 在任何目錄下輸入:
tree
- 或測試帶參數(shù)的命令:
tree -l 2 -f -s node_modules
注意事項
- 如果使用Python方法,確保Python已添加到PATH環(huán)境變量
- 修改環(huán)境變量后需要重啟命令提示符才能生效
- 如果遇到權(quán)限問題,可能需要以管理員身份運行命令提示符
- 方法二(打包成exe)是最獨立的方式,不依賴Python環(huán)境
這樣設(shè)置后,你就可以像使用系統(tǒng)命令一樣在任何位置使用你的tree腳本了。
Tree for Windows
補充一下,先是在網(wǎng)絡(luò)找了一下可能有的成熟工具或者解決方案,這里看的了這個工具,但是我沒用。因為上面的腳本滿足了我的需求并且可以自行擴展。
安裝Tree for Windows工具:
- 打開進(jìn)入 Tree for Windows 頁面,選擇下載 Binaries zip 文件。
- 解壓壓縮包,找到壓縮包內(nèi)的 bin 目錄,將 bin 目錄下的 tree.exe 復(fù)制
- 找到
C:\\Program Files\Git\usr\bin目錄,將 tree.exe 粘貼到該目錄下,安裝即完成
tree命令行參數(shù):
- -a 顯示所有文件和目錄。
- -A 使用ASNI繪圖字符顯示樹狀圖而非以ASCII字符組合。
- -C 在文件和目錄清單加上色彩,便于區(qū)分各種類型。
- -d 顯示目錄名稱而非內(nèi)容。
- -D 列出文件或目錄的更改時間。
- -f 在每個文件或目錄之前,顯示完整的相對路徑名稱。
- -F 在執(zhí)行文件,目錄,Socket,符號連接,管道名稱名稱,各自加上"*","/","=","@","|“號。
- -g 列出文件或目錄的所屬群組名稱,沒有對應(yīng)的名稱時,則顯示群組識別碼。
- -i 不以階梯狀列出文件或目錄名稱。
- -I 不顯示符合范本樣式的文件或目錄名稱。
- -l 如遇到性質(zhì)為符號連接的目錄,直接列出該連接所指向的原始目錄。
- -n 不在文件和目錄清單加上色彩。
- -N 直接列出文件和目錄名稱,包括控制字符。
- -p 列出權(quán)限標(biāo)示。
- -P 只顯示符合范本樣式的文件或目錄名稱。
- -q 用”?"號取代控制字符,列出文件和目錄名稱。
- -s 列出文件或目錄大小。
- -t 用文件和目錄的更改時間排序。
- -u 列出文件或目錄的擁有者名稱,沒有對應(yīng)的名稱時,則顯示用戶識別碼。
- -x 將范圍局限在現(xiàn)行的文件系統(tǒng)中,若指定目錄下的某些子目錄,其存放于另一個文件系統(tǒng)上,則將該子目錄予以排除在尋找范圍外。
以上就是基于Python實現(xiàn)一個Windows Tree命令工具的詳細(xì)內(nèi)容,更多關(guān)于Python Windows Tree命令工具的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于python內(nèi)置函數(shù)與匿名函數(shù)詳解
下面小編就為大家分享一篇基于python內(nèi)置函數(shù)與匿名函數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
在Python的Flask框架中構(gòu)建Web表單的教程
Flask框架中自帶一個Form表單類,通過它的子類來實現(xiàn)表單將相當(dāng)愜意,這里就為大家?guī)鞵ython的Flask框架中構(gòu)建Web表單的教程,需要的朋友可以參考下2016-06-06
Pandas之Fillna填充缺失數(shù)據(jù)的方法
這篇文章主要介紹了Pandas之Fillna填充缺失數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Python 2.7.x 和 3.x 版本的重要區(qū)別小結(jié)
這篇文章主要介紹了Python 2.7.x 和 3.x 版本的重要區(qū)別小結(jié),需要的朋友可以參考下2014-11-11

