批处理脚本列出根文件夹,然后列出其中大于指定大小的所有文件

Posted

技术标签:

【中文标题】批处理脚本列出根文件夹,然后列出其中大于指定大小的所有文件【英文标题】:Batch Script to list the root folder and then all files inside it greater than a specified size 【发布时间】:2012-09-16 23:48:24 【问题描述】:

我正在尝试编写一个脚本,我必须使用以下逻辑列出文件夹内的所有文件夹:

说文件夹A、B、C在文件夹F里面 A、B 和 C 包含子文件夹和文件。

我必须编写一个脚本,将文件夹 A、B、C 显示为标题,然后列出其中超过指定大小的文件(包括子文件夹)...如果可能的话,附上修改日期。

我已经准备好了骨架。

@echo off & setLocal EnableDelayedExpansion 推 C:\F

for /f "tokens=* delims= " %%a in ('dir/b/a:d') do (

echo %%a >>C:\F\list.txt
echo "-----------------------------------------------">>C:\F\list.txt
pushd %%a 
for /f "tokens=* delims= " %%i in ('dir/b/s') do (
    echo %%i >>C:\F\list.txt
    if %%~Za gtr 10000 echo %%i is %%~Za >>C:\F\list.txt
    ))

想要的输出是:

目录 A

file1 size1 date1

file2 size2 date2

目录 B

file3 size3 date3

file4 size4 date4

目录 C

file5 size5 date5

file6 size6 date6

---日期字段不是强制性的,但如果包含更好。

感谢和问候

【问题讨论】:

【参考方案1】:

以下是代码的总体思路。它基本上搜索每个目录和子目录,并找到指定类型的所有文件。然后程序找到每个唯一的文件目录并搜索大于指定大小的文件以您请求的格式输出。注意:代码中包含许多“额外”用于故障排除。随意删除不必要的文本文件。 =]

@echo off & setLocal EnableDelayedExpansion pushd C:\F

::sets size limit
SET sizelimit=10000

::searches for all files in directories and subdirectories and outputs to files.txt
dir /b/s >> files.txt

::finds all .zip files in files.txt
type files.txt | findstr /E .zip > myfile1.txt

::finds all .zip file locations and unique file locations
FOR /F "tokens=* delims=\" %%a in (myfile1.txt) do @echo %%~dpa >>filelocations.txt
FOR /F "delims==" %%L in (filelocations.txt) do find "%%L" unique.txt>nul || echo %%L>>unique.txt

::Loops through each unique location, finds all the .zip files and checks if they are larger
:: than the specified file size, then outputs the results to output.txt
FOR /F "tokens=* delims= " %%a in (unique.txt) do (
echo %%a >>output.txt
findstr "%%a" myfile1.txt >temp.txt
FOR /F "tokens=* delims=" %%a in (temp.txt) do (
if %%~za gtr %sizelimit% echo %%~nxa %%~za %%~ta >>output.txt
)
)

end local

::Cleans up extra files (which are generated for troubleshooting purposes)
del files.txt myfile1.txt filelocations.txt unique.txt temp.txt

【讨论】:

谢谢@Jeff k。这很有帮助。但是,Unique.txt 中的所有子文件夹都将被视为唯一的文件位置。因此,它们将被打印为“echo %%a >>output.txt”。我的需要是只打印文件夹“F”内的文件夹作为标题,即 A、B、C,并根据它们的大小列出每个文件夹(包括子文件夹)内的文件。你能帮忙吗? @user1697214 unique.txt的for循环:FOR /F "tokens=* delims= " %%a in (unique.txt) do (echo %%a >>output.txt应该打印每个子文件夹,然后继续查找该子文件夹下的所有文件,然后打印子文件夹2并打印子文件夹2下的所有文件,等等。您还可以在echo %%a >>output.txt 行下添加空格以强调标题格式【参考方案2】:

回复your question HERE。

好吧,您可以将输出通过管道传输到sort,但这样做至少存在三个问题。

第一个问题是,当您将其添加到末尾时,它一次只能排序一行。这意味着它根本没有排序。要解决此问题,您可以将整个 for 命令放在块 () 中,然后将块的输出通过管道传输到 sort,这会导致其他问题,尽管我相信可以解决这些问题。

第二个问题是它按字母顺序排列日期,从月份开始。这意味着所有 1 月 1/dd/yyyy 将首先出现,然后所有 10 月 10/dd/yyyy 表示您将所有年份混合在一起,并按 1 月、10 月、11 月、12 月、2 月、3 月等排序。

您可以使用sort/+col 命令按大小排序,但您将比较size[tab]filename,意思是2[tab]hello 出现在1000[tab]hello 之后。 (输入 sort /?ENTER 以了解有关排序的更多信息。)

我建议使用dir 的排序能力,如下所示:

:: Sort by name
FOR /F "tokens=* delims= " %%a in ('dir /b /o:n ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

:: Sort by size
FOR /F "tokens=* delims= " %%a in ('dir /b /o:s ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

:: Sort by date
FOR /F "tokens=* delims= " %%a in ('dir /b /o:d ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

/o: order 命令还有其他选项。在命令提示符处键入 dir /?ENTER 以获取有关 dir 工作原理的更多信息。

【讨论】:

非常感谢您启发了我的知识库。我想按大小排序,因此 ('dir /b /o:s ') 选项对我来说看起来不错。但是,它不会遍历子文件夹,并且我的脚本中有 ('dir /b /s')。因此我尝试使用 ('dir /b /s /o:s') 但这不会对整个文件列表进行排序。它的作用是,它只对每个目录中的文件进行排序。是否可以对整个列表(子文件夹内的文件)进行排序? 不,对整个目录树进行排序的唯一方法是将整个目录树读入内存,或读入文件,然后按此方式排序。 @user1697214 - 我意识到你可能没有收到我的消息,所以:“不,对整个目录树进行排序的唯一方法是将整个目录树读入内存或文件,然后按这种方式排序”

以上是关于批处理脚本列出根文件夹,然后列出其中大于指定大小的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

列出所有Google云端硬盘(根)文件

列出当前目录和所有子目录中特定大小的文件

linux 列出home文件夹的大小 包括所有子文件夹

用python 列出指定目录下所有的txt文件,并输出每个文件的创建日期和大小

Linux 命令之find

Git常用命令--(ls,cat,mv,touch)