列出文件,以递归方式显示Windows命令提示符中的完整路径和文件大小


50

我正在尝试生成一个文本文件,其中包含特定目录及其任何子目录中所有文件的文件名(包括完整路径)和文件大小(即,递归)。理想情况下,我不想在文件大小中使用逗号(但我会解决这些问题!)

以下命令可以执行此操作,但不包含文件大小:

dir /b /s /a:-D > results.txt

输出示例如下:

C:\Users\Martin\Pictures\Table\original\PC120013.JPG  227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG  123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG  932344

我不认为dir单独使用是不可能的,尽管我很想证明自己是错的。仅使用命令提示符中可用的命令,还有另一种方法吗?

Answers:


28

应该这样做:

@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

这不是很有效...在包含大量文件的文件夹中运行它可能会比较困难,因此请首先在小型文件夹上尝试。

从“为/?” 帮助文本(我用“ a”代替“ I”)

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

The modifiers can be combined to get compound results:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

6
我使用此选项遇到了一个小问题:文件名中带有空格的文件未正确注册。为了解决这个问题,我添加了"tokens=*"以下内容@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
Don Vince

如何将其打印到txt文件?
Saeed Neamati 2015年

3
应该是for /r %a in (*) do echo %~fa %~za
ZAB

1
@Saeed Neamati-这是一个示例>> C:\Temp\VideoList.txt-之前进行的所有过程的结果都被写到名为VideoList的文本文件中。使用一个>将覆盖该文件(如果它已经存在),并使用>>将追加新的结果到年底如果文本文件(如果它已经存在)。如果文本文件尚不存在,则此命令将使用指定的名称写入新文件。
user23715 '16

这给了我* .dwg文件列表,没有文件大小,是文本文件:@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CAD bloke

14

选择#1:FOR / R对我而言比#2更直观。
替代方法2:FOR / F解决了BrianAdkins建议中“名称中的空格”的问题。
替代方案3:我建议选择FORFILES,只是路径用双引号引起来。

布赖恩(Brian)或其他专家可能有一个更优雅的解决方案,或者可能会提出其他十二种解决方案,但是这三项可行。我尝试使用FOR TOKENS,但随后不得不剥离页眉和页脚,因此我又回到了#1。我还考虑过创建一个小的.bat文件并调用它,但这会添加另一个文件(尽管它确实提供了更大的灵活性,就像函数一样)。

我测试了所有替代方法,包括目录和带有嵌入式空格的文件名,200多个字符的文件名,不带扩展名的文件名以及在小驱动器的根目录上(只是时间;有点慢-正如Brian所建议的-但后来如此)在Windows资源管理器中搜索;这就是为什么我安装了“所有搜索”应用程序的原因。

选择#1:FOR / R

最佳(?)在试图弄清为什么Brian的解决方案对我不起作用时,我看了一下HELP FOR并决定尝试使用/ R方法。(创建文件与替代方法2中的相同。)

@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA

示例-作品(与上述目录不同,以演示递归)

@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

备选方案2:FOR / F

BrianAdkins的建议: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

一个修正的回答是:

@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA 

抑制目录并输出(附加)到文件的更完整答案是:

@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt

注意:“ delims = *”指定文件名中不允许的字符。
注意:第二个命令还通过/ a:-d禁止显示目录。
注意:如果有人选择了不同的变量名,则将FOR变量名大写以阐明变量和变量参数之间的区别。
注意:由于OP要求输出到文件,因此仅针对咧嘴声进行归档。

我想我应该检查一下ECHO的状态并将其重置。

问题-名称中的空格

Brian提出的解决方案不处理包含空格的文件和文件夹名称(至少在我的Vista配置中不这样)。

示例-错误 (没有delims;包括每个OP的禁止目录,但文件名前后都有大小以进行强调)

截断的名称和大小(6个文件中有4个不正确):

@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
 C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
 C:\DeleteLater\Folder
 C:\DeleteLater\Folder
 C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

示例-正确 (注释输出到屏幕,未附加到文件)

@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

备选方案3:FORFILES (报价)

此解决方案直接来自FORFILES文档(forfiles /?)中的最后两个示例。

FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

将这些示例结合起来并写入文件即可得出答案(几乎):

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt

请注意,路径在输出中用引号引起来。
不要紧,无论echo onecho off翻转。
添加空白行分隔每个目录将是IF的重要扩展。

注意:使用掩码/m *.*不会返回没有扩展名的文件(例如示例中的最后一个文件)!

除了:这写在每个目录只有该目录内容的文件:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"不是什么OP想,但有时很方便。

示例-作品(但用全路径加引号)

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize"

"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0

本示例包括一个额外的目录,该目录具有超长文件名和不带扩展名的文件名。

问题:引号路径

因此,是否有一种简单的方法可以删除每个OP示例中不需要的(?)引号并保存替代方法3:FORFILES。(反问:引号是功能还是缺陷?)


1

我意识到这需要额外的功能,但是您可以使用sfk实用工具来相当简洁地实现:

sfk cwd +run -yes "sfk list -size -tab $qfile +toclip"

sfk fromclip > C:\_temp\sfk_list_output.txt

(我在这里使用了sfk命令链的方法)


1
powershell "dir | select name,length"

这可能是对OP问题的欺骗。但是,该问题不再与基于现代Windows的系统相关。Dir别名用于帮助绘制逻辑链接。


2
我试过了(Windows 7)。(在具有20个条目的目录上)运行花费了30秒钟以上,并且没有下降到子目录中。
斯科特(Scott)

要进行递归,请更改为: powershell "Get-ChildItem -Recurse| select name,length"
giorgiomugnaini

0

下面是我用来查找在网络驱动器上占用过多空间的其他视频文件,并将结果写到本地PC上的文本文件的方法。

我发布自己的答案有些晚,原因有三点。第一,我喜欢简洁的答案。第二,这行脚本对我来说有多种设置,包括跨网络。唐恩·文斯(Don Vince)在BrianAdkins的回答下可能含糊其辞的评论是三个,使用令牌可以绕过文件名中带有空格的问题。

for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt

我注意到很长的文件路径/文件名(数百个字符)也会导致错误,但是搜索不会挂在上面。但是,仍未针对您的目标全面探索路径。注意到后,您可以通过更深入地进入文件夹结构来消除此错误,从而进行补偿。

ss64页很好地介绍了dir命令的用法,列出了所有开关,许多开关组合,并显示了一些有用的正确语法示例。它不像各种Stack Exchange社区那样全面,但是一旦您熟悉命令行/批处理脚本,演示文稿中就会有明确的清晰度。


0

我已经通过以下命令达到了这一点:

(for /R "\path\to\directory\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

结果:

D:\Users\Natasha>(for /R ".\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"


D:\Users\Natasha\Flowers_ (12).jpg 118886

D:\Users\Natasha\SomeFolder\data.txt 1241

D:\Users\Natasha\SomeFolder\CS\Counter-Strike_1.6.exe 272645624

PS这是基于BillR的答复(替代方案1)。但是,就我而言,它挂了@echo off


0

我发现“ du”命令非常有用,它在Windows和Unix上均可使用(用于在将大量数据从Windows PC传输到Linux Web服务器时检查是否复制了所有文件):

du -ah "C:\your_dir" > "C:\file_list.txt"

输出:

15  C:\your_dir/.htaccess
608 C:\your_dir/folder/hello.txt
1.0 C:\your_dir/folder/subfolder/test.txt
1.0 C:\your_dir/folder/subfolder
1.2M    C:\your_dir/folder/world.txt
1.2M    C:\your_dir/folder
9.0 C:\your_dir/no_file_ending
11  C:\your_dir/sample document 1.txt
684K    C:\your_dir/sample document 2 - äöüßÄÖÜáà.txt
1.9M    C:\your_dir

但是,我只能在Notepad中正确看到特殊字符,而在Notepad ++中则看不到(必须是ANSI / UTF-8编码的东西,现在没有时间进行准确分析)。我也没有找到在文件名后显示大小的解决方案。使用“ b”或“ k”选项而不是“ h”来显示大小(以字节或千字节为单位)。在要分析的文件夹外部运行命令时遇到了一些麻烦。因此最好同时在正确的目录(此示例中为“ C:\ your_dir”)中输入命令,并在命令中指定它。


-1

省略dir / b / s / a:-D> results.txt中的b,结果应如下所示(即dir / s / a:-D> results.txt):

驱动器H中的卷为FILES卷序列号为C9EB-112E

H:\ Files目录

2014年9月29日11:36 PM 0 testing.txt 1个文件0个字节

H:\ Video \ Action \ Comix的目录

2012年10月6日
09:51 AM 184,740 file1.txt 2012年7月20日06:21 AM 864,832 file2.txt 2009年8月31日08:47 PM 606,638 file3.txt 2009年8月31日09:07 PM 160,320 file4 。文本


不是原始问题的答案。它不会产生OP所要求的输出。
DavidPostill

-1
where * /t  

不必太复杂,这应该会产生所需的输出。它比OP要求的要多,但我认为值得一提。添加/ R开关以指定当前目录以外的目录。


1
考虑按照我的尝试更新并确认您的答案是否有效,并收到一条错误消息,ERROR: Invalid syntax. Value expected for '/r'因此请考虑返回至绘图板并提供正确的语法,并使用正确的详细信息编辑您的答案。
Pimp Juice IT

考虑输入值... / R是目录开关,如果不输入,则默认为当前目录。
someguy

“这将给OP带来更多的收益”。你在开玩笑吗?  where /?说,“默认情况下,搜索是沿着当前目录以及PATH环境变量指定的路径进行的”,因此您的where * /t命令会列出中的每个文件C:\Windows\System32,中的某些子目录C:\Program Files以及中的所有其他目录PATH。对我来说,那超过3000行。请考虑修改您的答案以使其合理。PS没有  /R,它不是递归的。
斯科特(Scott)

在/ R。*。*为我工作。/ R。表示从指定位置(在本例中为当前目录)进行递归搜索。*。*是要匹配的模式。因此,/ R%USERPROFILE%* .docx将显示用户文件夹中的所有word文件。(必须在这些注释中使用\进行转义*)
DHW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.