我通常bash
在 Windows 上使用 MSYS2,但是,我必须检查一个巨大的网络共享(MSYS2 版本会tree
阻塞 - 也就是说,需要很长时间),所以我不得不使用 Windows 工具。
因此,基本上,命令的输出tree
如下所示:
C:\Users\me\Videos>tree /f .
Folder PATH listing for volume Windows
Volume serial number is 6789-B2DA
C:\USERS\ME\VIDEOS
│ my_test.avi
│
├───Captures
├───Debut
├───kdenlive-renderqueue
├───Logitech
│ └───LogiCapture
│ 2020-11-24_09-19-44.jpg
│
├───test
│ test.mlt
│
├───test1
│ test1.mlt
│
└───titles
这里的输出看起来是经过排序的,但在我必须检查的大量网络共享中,我发现没有排序,因为Windows“树”命令随机排序确认。
因此,通过使用:
powershell "tree /f . | tee C:\Users\me\mylist.txt"
...我可以使用 UCS-2 BE BOM 编码在文本文件中获取列表 - 并且使用 Notepad++,我可以将此文件转换为 UTF-8。
所以,我想知道 - 在 DOS/Windows 世界或 bash/Unix 世界中是否存在某种程序/脚本,可以解析命令的此类输出tree
并提供相同的排序输出?(我对文件/目录名称的字母顺序感兴趣,按升序排列,先是目录,然后是文件)。
答案1
您可以尝试从命令行而不是 Powershell 使用“dir”。
dir /s /b
- /s 包括子目录
- /b bare(仅显示文件/文件夹)
或者添加参数 /o:g (排序,目录优先)
dir /s /b /o:g
答案2
我制作了一个 Windows bat 文件,其中包括 PowerShell 命令,它创建了一个与 tree 命令非常相似的格式输出,但经过了排序。只需将此代码复制为 maketreehere.bat(可以使用记事本并更改扩展名)到您想要分析的文件夹中,然后从 CMD 运行或从 Windows 资源管理器双击即可。希望它能帮助其他人!
@echo off
title Make Tree Script by Zentico
chcp 65001
echo Reading folder structure for files and directories.
dir /b /s /a-d > "tree_raw_f.txt"
dir /b /s /ad > "tree_raw_d.txt"
echo Eliminating current path and adding tags.
REM Replace backslashes (\) in CURRENT_PATH with escaped backslash
set "CURRENT_PATH=%CD:\=\\%"
powershell -Command "(gc tree_raw_f.txt -encoding UTF8 | Where-Object {$_ -notmatch 'tree_raw_f.txt'}) -replace '^(.*\\)(.*)$', '${1}00001$2' -replace '%CURRENT_PATH%\\', '' | Out-File -encoding UTF8 tree_noroot_f.txt"
powershell -Command "(gc tree_raw_d.txt -encoding UTF8 | ForEach-Object {$_ + '\00000'}) -replace '%CURRENT_PATH%\\', '' | Out-File -encoding UTF8 tree_noroot_d.txt"
echo Merging and sorting.
powershell -Command "(gc tree_noroot_f.txt, tree_noroot_d.txt -encoding UTF8 | Sort-Object) | Out-File -encoding UTF8 tree_sorted.txt"
echo Eliminating tags and adding formatting.
REM Get the current date in the format YYMMDD
set CURRENT_DATE=%date:~12,2%%date:~4,2%%date:~7,2%
powershell -Command "(gc tree_sorted.txt -encoding UTF8) -replace '00001', '' -replace '([^\\]+)\\00000', '├───$1:' -replace '(.*?)\\', '│ ' | Out-File -encoding UTF8 %CURRENT_DATE%_tree.txt"
echo Cleanup.
REM Delete intermediate files
del tree_raw_f.txt tree_raw_d.txt tree_noroot_f.txt tree_noroot_d.txt tree_sorted.txt
REM End and wait for keypress
pause