2013-10-03 12:50:47 +0000 2013-10-03 12:50:47 +0000
53
53

从Windows命令提示符递归地列出文件,只显示完整路径和文件大小。

我试图生成一个文本文件,其中包含一个特定目录中所有文件的文件名(包括完整路径)和文件大小,以及它的任何子目录(即递归)。理想情况下,我不希望在文件大小中加入逗号(但我会接受它们!)

下面的命令可以做到这一点,但不包含文件大小:

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就能做到这一点,尽管我很想证明我是错的。是否有其他方法可以做到这一点,只使用命令提示符中可用的命令?

答案 (9)

28
28
28
2013-10-03 13:44:16 +0000

这应该可以了。

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

这不是很有效…在包含大量文件的文件夹中运行它可能会有问题,所以先在小文件夹中试试。

从 “for /? "帮助文本(我用了'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
``` 。
15
15
15
2013-10-03 23:34:41 +0000

替代方案#1:FOR /R对我来说比#2更直观。
备选方案#2:FOR /F解决了BrianAdkins建议中 “名字中的空格 "的问题。
备选方案#3:FORFILES是我的选择,除了路径是双引号。

Brian或其他大师可能会有更优雅的解决方案,或者能提出一打其他的解决方案,但这三个方案是可行的。我试过使用FOR TOKENS,但后来不得不剥离页眉和页脚,所以我又回到了#1。我也考虑过创建一个小的.bat文件并调用它,但那会增加另一个文件(尽管它确实提供了更大的灵活性,就像一个函数一样)。

我测试了所有的备选方案,包括带空格的目录和文件名、200多个字符的文件名、没有扩展名的文件名,以及在一个小硬盘的根部(只是为了节省时间;有点慢–就像Brian建议的那样–但在Windows资源管理器中搜索也是如此;这就是为什么我安装了Everything搜索程序)。

备选方案#1: FOR /R

最佳(?)在试图弄清楚为什么Brian的解决方案对我不起作用的时候,我看了HELP FOR,决定尝试/R的方法。(创建文件的方法和第2种方法一样。

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

Example - Works (与上面不同的目录来演示递归)

@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 Spacesnd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

备选方案#2: FOR /F

BrianAdkins的建议。

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

注:"delims=/*"指定了文件名中不允许使用的字符。
注:第二条命令也通过/a:-d抑制目录。
注:将FOR变量名改为大写,以便在有人选择不同的变量名时明确变量和变量参数的区别。
注:附加到文件只是为了搞笑,因为上位机要求输出到文件。

我想我真的应该检查一下ECHO的状态,然后把它复位。

问题 - 名称中的空格

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

Iample - Wrong(无 delims; 包括按 OP 压制目录,但文件名前后都有大小以强调)

Truncated Name and Size (6 个文件中有 4 个不正确)。

@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

示例 - 正确(注意输出到屏幕上,而不是附加到文件中)

@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\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

备选方案#3:FORFILES (报价问题)

这个解决方案直接来自FORFILES文档中的最后两个示例(@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za)。

@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 Spacesnd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

结合这些例子并写入一个文件,得到的答案(几乎)是:

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

请注意输出中的路径是引号。
不管是forfiles /?还是echo on被切换,都不重要。
在每个目录之间添加一个空行,是IF的琐碎扩展。

Caution 。使用掩码echo off将不会返回没有扩展名的文件(比如例子中的最后一个文件)!

Aside 。这将在每个目录下写一个文件,内容只包含该目录。
/m *.* 不是上位机想要的,但有时很方便。

Example - Works (but with fullpath in quotes)

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

这个例子包括一个超长文件名的额外目录和一个没有扩展名的文件名。

问题。路径中的引号

那么,是否有一个简单的方法来去除OP例子中不需要的(?)引号,并保存备选方案#3:FORFILES。(反问:引号是一个特点还是一个缺陷?)

1
1
1
2018-03-23 18:47:14 +0000
powershell "dir | select name,length"

这可能是在欺骗上级的问题。然而,这个问题在现代基于Windows的系统上已经不再适用。Dir别名是用来帮助画出逻辑联系的。

1
1
1
2014-02-12 12:47:47 +0000

我意识到这需要一个额外的工具,但你可以使用 sfk工具来实现这个功能。

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

sfk fromclip > C:\_temp\sfk_list_output.txt

(我的方法是使用sfk命令链)

0
0
0
2017-11-11 17:59:32 +0000

我发现 “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"),又在命令中指定它。

0
0
0
2016-07-14 00:19:25 +0000

下面是我用来定位网络硬盘上占用空间过大的杂七杂八的视频文件,并将结果写到本地电脑的文本文件中。

我把自己有点晚的答案贴出来,原因有三。一,我喜欢简洁的答案。二,这一行脚本对我来说在多种环境下都能工作,包括在网络上。第三,根据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
0
0
2017-01-12 13:48:02 +0000

我用下面的命令达到了这个目的。

(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

P.S. 这是根据BillR的回答(备选方案1)。然而在我的情况下,它以@echo off挂起。

-1
-1
-1
2014-09-30 03:41:04 +0000

省去dir /b /s /a:-D > results.txt中的b,结果应该是这样的,(即dir /s/a:-D > results.txt):

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

H:\Files目录

09/29/2014 11:36 PM 0 testing. txt 1 文件 0 字节

H:\Video\Action\Comix 目录

10/06/2012 09:51 AM 184,740 file1.txt 07/20/2012 06:21 AM 864,832 file2.txt 08/31/2009 08:47 PM 606,638 file3.txt 08/31/2009 09:07 PM 160,320 file4.txt

-1
-1
-1
2018-03-22 20:22:09 +0000
where * /t

不用太复杂,这应该会产生想要的输出。它提供的内容比上位机要求的要多一些,但我认为值得一提。添加/R开关来指定一个非当前目录。