对 Windows 树命令的输出进行排序?

对 Windows 树命令的输出进行排序?

我通常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

相关内容