标题: [文件操作] 批处理如何删除多文件夹下重复的文件? [打印本页]
作者: regabc 时间: 2011-5-24 13:05 标题: 批处理如何删除多文件夹下重复的文件?
如何删除多文件夹下重复的文件?
只处理重复性的txt,只能保留唯一一个,删除重复的文件。
作者: Batcher 时间: 2011-5-24 13:08
你打算怎样判断重复文件?根据文件名?文件大小?文件的MD5?
作者: regabc 时间: 2011-5-24 13:09
2# Batcher
文件名,就是删除文件名。
作者: CrLf 时间: 2011-5-24 13:19
本帖最后由 zm900612 于 2011-5-24 15:17 编辑
常规思路:- @echo off
- for /f "delims=" %%a in ('dir /s /b /a-d *.*') do (
- if defined %%~nxa (
- del "%%a"
- ) else set "%%~nxa=."
- )
复制代码
另类思路,高效简明:- @echo off
- for /r %%a in (*.*) do (
- del /f /s "%%~nxa" 3>>"%%a"
- ) 2>nul
- ::嘿嘿,句柄,你懂得
- pause
复制代码
作者: CrLf 时间: 2011-5-24 13:24
刚才漏了一对双引号,已修改
作者: regabc 时间: 2011-5-24 13:42
5# zm900612
不行那,完全不凑效。
作者: CrLf 时间: 2011-5-24 14:38
本帖最后由 zm900612 于 2011-5-24 15:17 编辑
6# regabc
大概是因为方法二的测试参数忘了去掉,已经改好
好吧,方法一确实也错了...漏了/b
作者: wolonga123 时间: 2011-5-24 22:51
4# zm900612
句柄的那个不懂..尤其那是3>>"%%a"
作者: plp626 时间: 2011-5-24 23:00
4# zm900612
常规思路很不通用,甚至会误删;
另类思路那个,句柄,我不懂。。。
解释下,谢谢。
作者: CrLf 时间: 2011-5-24 23:16
9# plp626
不会误删,因为if的条件语句是和语块一起划分的,证据是它和for一样不接受变量延迟参数,若在条件语句中用变量延迟或%%a来试图切换是否使用not,那是一定会出错的。所以划分if defined的时候%%a尚未被解释,也就不存在空格的问题
作者: CrLf 时间: 2011-5-24 23:27
而另类思路,其实我最初是打算用文件属性来筛选,但是忽然想起来当一个文件被正在试图写入的句柄占用时,除了这个句柄能够进行写入操作以外,它是只读的。所以我用一个空句柄对要保留的文件进行附加操作,这样一来,这个文件对del来说是正被占用而无法删除的,但是别的同名文件却能被成功删除,也就达到了删除重复文件的效果。一个创新,没想到竟然连plp都看不懂…看来有可能是首创了,我好高兴啊
作者: plp626 时间: 2011-5-24 23:48
本帖最后由 plp626 于 2011-5-24 23:51 编辑
来当一个文件被正在试图写入的句柄占用时,除了这个句柄能够进行写入操作以外,它是只读的。
我是句柄盲,有空研究下。。。呵呵;
=====================
4楼第一个代码,
文件名含有等号时。。。
=====================
对重复文件的判定:
A:文件名同
B:文件名同,体积同
C:体积同,内容同
到底是那个,楼主呢?
作者: CrLf 时间: 2011-5-25 00:01
12# plp626
等号的问题确实要命,以前没想过,但是文件名含空格的情况却不会影响if defined,原因已经在前面说了的。if是一个特殊的语块,不能用像看待普通语句一样去判断它的预处理流程。最后,邀请plp兄合个影,以作千贴留念,同意请说茄子…
作者: plp626 时间: 2011-5-25 00:01
本帖最后由 plp626 于 2011-5-25 00:24 编辑
哦,我没看3楼,走神,不好意思。。
====================
这个问题很贴近生活,代码一定也很实用,我很喜欢。。
建议大伙不妨写个【通用,稳健的】代码,就是根据不同的重复定义删除,以及根据创建时间或修改时间选择那个唯一保留。
======================
13# zm900612
可爱,来和一张。。。
作者: plp626 时间: 2011-5-25 00:19
关于内容重复,若用md5会很费时,为了快速只要做个概率算法;
把内容同定义为体积同,且“文件头”同;这样应该可以达到99%以上的概率,且速度快,复制的文件比然被过滤掉。。
而往往我们电脑上存在的重复文件很多事复制而得的重复。。
================
如果再深入,可以考虑相似度。。。很多修改的文件,复制后的修该文件。。。怎么定义相似度。。。
作者: regabc 时间: 2011-5-25 00:27
看来BAT还不能解决这样的问题,得用VBS或者脚本语言.
作者: CrLf 时间: 2011-5-25 12:31
两个方法均已测试,如果还是不行,那我无能为力
作者: plp626 时间: 2011-5-25 12:50
学习下:
如何判断一个带空格的字符串是否作为变量已定义:
这个方法蛮实用的(不启用变量延迟)- for /f "delims=" %%a in ("%~1")do if defined %%a echo 已定义。。。
复制代码
- set "abc"de 666=0"
- for /f "delims=" %%a in (^"abc"de 666")do if defined %%a echo 已定义
复制代码
作者: Bearxy 时间: 2011-5-25 13:06
纠结,我就是不明白"%%~nxa"的意思……
作者: plp626 时间: 2011-5-25 13:12
19# Bearxy
粘贴下面代码在桌面左下角的 开始的 运行框里,然后回车:复制代码
作者: CrLf 时间: 2011-5-25 14:03
本帖最后由 zm900612 于 2011-5-25 16:44 编辑
14# plp626
通用的也不难嘛,等号我是没办法,别的倒好办- @echo off
- for /f "delims=" %%a in ('dir /s /b /a-d *.*') do (
- if defined %%~nxztaa (
- del "%%a"
- ) else set "%%~nxztaa=."
- )
复制代码
作者: plp626 时间: 2011-5-25 16:36
21# zm900612
%%~szta 文件路径和文件名的短名形式+体积+修改时间
文件路径本身就唯一了,你还判断defined,不是永远不会再“defined”了么?
抛开楼主的问题;我觉得实用的应该是体积同,文件名不同的重复文件在生活中较多;————很多复制的文件。
作者: CrLf 时间: 2011-5-25 16:45
22# plp626
忘了%%~sa是带路径的了,看来还是得用%%~nxa
作者: plp626 时间: 2011-5-25 16:46
用 %~tza能判断99%以上的复制文件:
作者: plp626 时间: 2011-5-25 17:09
想了下,实用的这个不是批处理做的,又是娱乐。。
作者: Batcher 时间: 2011-5-25 23:47
19# Bearxy
浅谈批处理for命令中的变量扩展
http://bbs.bathome.net/thread-2205-1-1.html
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |