Board logo

标题: [文件操作] 批处理如何查询大小超过30G的文件? [打印本页]

作者: kevinll    时间: 2013-3-27 11:53     标题: 批处理如何查询大小超过30G的文件?

我想查询一个目录下所有.DBF文件大小超过30G的,有的话输出到一个文本里,批处理如下:
批处理1:
  1. @echo off
  2. set /a size=30*1024*1024*1024
  3. for /r %%i in (*.dbf) do if %%~zi GTR %size% echo "%%i" >check_size.txt
复制代码
批处理2:
  1. @echo off
  2. for /r %%i in (*.dbf) do if %%~zi/30/1024/1024/1024 GTR 1 echo "%%i" >check_size.txt
复制代码
两个都有问题的,第一个溢出了,第二个查询不出来,我试了一个32G的文件。请大家帮忙看看,谢了!
作者: Demon    时间: 2013-3-27 12:05

32位CMD只支持32位有符号整数
作者: kevinll    时间: 2013-3-27 12:27

我的系统是64位的,那CMD应该也是64位的吧? 如果是因为数值太大的话,那么我的问题就无解了吗?
作者: kevinll    时间: 2013-3-27 12:29

字节能换成M或者G吗?这样位数就够了
作者: cjiabing    时间: 2013-3-27 12:46

改下思路:用dir搜索文本连带文件大小到一个txt中,再挑出超过大小的。
这样效率可能高点。
作者: kevinll    时间: 2013-3-27 13:56

如何用DIR只显示文本名字和文本大小呢?
作者: cutebe    时间: 2013-3-27 15:57

  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. FOR /F "DELIMS=" %%S IN ('DIR/S/B/A-D *.DBF')DO (
  4.  SET SIZE=0000000000%%~ZS
  5.  IF "!SIZE:~-11!" GTR "32212254720" ECHO %%~S
  6. )
  7. PAUSE
复制代码

作者: Batcher    时间: 2013-3-27 22:23

  1. find.exe . -size +30G
复制代码
http://www.bathome.net/thread-1114-1-1.html
作者: kevinll    时间: 2013-3-28 09:39

本帖最后由 kevinll 于 2013-3-28 09:42 编辑

回复 7# cutebe

谢谢!测试了几次,都成功了。不过有个问题,这一句:SET SIZE=0000000000%%~ZS ,我看赋值后SIZE也是为-2147483648啊,前面补这么多0什么意思呢?
作者: kevinll    时间: 2013-3-28 10:00

回复 8# Batcher


    您这个我试了,find.exe . -size +30G,报错了:
find.exe: invalid -size type `G'
用法是什么呢?能否把结果输出到一个文本里去呢?
作者: Batcher    时间: 2013-3-28 10:19

回复 10# kevinll
  1. find.exe -size +30000000k
复制代码

作者: kevinll    时间: 2013-3-28 10:49

回复 9# kevinll

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "DELIMS=" %%S IN ('DIR/S/B/A-D *.DBF')DO (
 SET SIZE=0000000000%%~ZS
 IF "!SIZE:~-11!" GTR "32212254720" ECHO %%~S>>out.txt
)
PAUSE

发现了一个问题,不能递归,如果有子文件的话,返回的结果少
作者: kevinll    时间: 2013-3-28 10:54

回复 11# Batcher


    这次可以运行了,不过能进行过滤吗?比如说查找.DBF文件。
还有命令没有帮助文档啊?我也下了几个别的命令,都没有发现帮助文档
作者: tmplinshi    时间: 2013-3-28 11:52

回复  Batcher


    这次可以运行了,不过能进行过滤吗?比如说查找.DBF文件。
还有命令没有帮助文档 ...
kevinll 发表于 2013-3-28 10:54
  1. find.exe -name *.DBF -size +30000000k
复制代码
find --help 可以看到简单的帮助。详细的帮助可以在 Google 中搜索 unix find
作者: lucky5156    时间: 2013-3-28 11:59

新手学习之中……………………
作者: kevinll    时间: 2013-3-28 13:58

本帖最后由 kevinll 于 2013-3-28 14:24 编辑

我这还有问题,关于find.exe, 我指定-path 不管用,在windows上,-path怎么用呢?可以这样吗:-path e:\data
作者: kevinll    时间: 2013-3-28 14:52

在windows上用UNIX的命令,每次用都要先COPY吗?
作者: kevinll    时间: 2013-3-28 15:24

试了一个 -size +1048576k,即1G,却查不出来,明明有一个24G的文件,:

find.exe    -name *.DBF -size +1048576k
作者: tmplinshi    时间: 2013-3-28 17:33

试试这个:
  1. ndir -s "-cond=size>=1*1024*1024*1024" f:\*.DBF
复制代码
http://thomaslauer.com/comp/ndir
作者: Batcher    时间: 2013-3-28 18:15

回复 13# kevinll
  1. find.exe . -name "*.DBF" -size +30000000k
复制代码
教程:
http://bbs.chinaunix.net/thread-441883-1-1.html
作者: Batcher    时间: 2013-3-28 18:20

回复 17# kevinll


    不需要,你可以把它放到当前目录。或者使用命令的完整路径C:\UnxUtils\find.exe
作者: cutebe    时间: 2013-3-29 08:40

回复 9# kevinll
把SIZE当作字符串来比较,而不是数值
作者: kevinll    时间: 2013-3-29 11:54

谢谢各位。不过谁给看i看这个问题啊:
试了一个 -size +1048576k,即1G,却查不出来,明明有一个24G的文件:

find.exe    -name *.DBF -size +1048576k
作者: Batcher    时间: 2013-3-29 12:22

回复 23# kevinll


    "*.DBF"双引号不要丢
作者: terse    时间: 2013-4-1 14:03

  1. @echo off
  2. set ph=e:\b\&set ext=dbf
  3. set FileSize=123456789
  4. for /f "tokens=*" %%i in ("%ph%") do set d=%%~di&set "p=%%~pi"
  5. wmic datafile where "drive='%d%' and path='%p:\=\\%' and extension='%ext%' and FileSize>='%FileSize%'" get FileName
  6. pause
复制代码

作者: piszhao19870928    时间: 2013-4-2 20:35

@echo off
set /a size=30*1024*1024*1024
for /r %%i in (*.dbf) do if %%~zi GTR %size% echo "%%i" >>check_size.txt
作者: CrLf    时间: 2013-4-2 23:18

  1. @echo off
  2. set /a min=30*1024*1024*1024
  3. set "min=000000000000000000%min%"
  4. set "min=%min:~-20%"
  5. for %%a in (*.dbf) do (
  6.    set "file=%%a"
  7.    set "size=000000000000000000%%~za"
  8.    setlocal enabledelayedexpansion
  9.    if !size:~-20! gtr !min! echo !file!
  10.    endlocal
  11. )
  12. pause
复制代码

作者: CrLf    时间: 2013-4-2 23:20

  1. @echo off
  2. set /a min=30*1024*1024*1024
  3. set "min=000000000000000000%min%"
  4. set "min=%min:~-20%"
  5. (echo %min%
  6. for %%a in (*.dbf) do (
  7.    set "file=%%a"
  8.    set "size=000000000000000000%%~za"
  9.    setlocal enabledelayedexpansion
  10.    echo !size:~-20!:!file!
  11.    endlocal
  12. ))>tmp.txt
  13. for /f "tokens=1* delims=:" %%a in ('sort tmp.txt') do (
  14.    if defined flag echo;%%b
  15.    if %%a==%min% set flag=yes
  16. )
  17. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2