标题: [请教]怎么获取各个文件夹下都有的最新的同名文件?
[打印本页]
作者: Billunique
时间: 2007-3-22 05:57
标题: [请教]怎么获取各个文件夹下都有的最新的同名文件?
现在有个这样的问题向各位求教,恳请帮忙。
在一个网络目录下,假设为\\server\ourmyfile\
它下面有很多的子文件夹,这些子文件夹视不同的情况有很多层。
但许多子文件夹下都有一个我需要的文件,比如goal.htm,它们名称相同,但最后的修改日期都是不同的。另外每个文件夹的日期对应goal.htm的日期(即文件夹新,它里层的goal.htm就新)。
我现在想把它们中最新的goal.htm(只包含其路径信息)搜出来,即让全部的goal.htm按日期由新到旧排列,该怎么操作呢?
本人小菜一个,我自己想到的方法仅是:
set path1=\\server\ourmyfile
dir /s /b /o-d %path1%\goal.htm >>a.txt
但是/o-d只在每个文件夹内部有效,而提取出的goal.htm还是会按照dir出来的每个goal.htm的根文件夹的顺序来排序,这样的话关键就在于文件夹的排列顺序了。
然而我发现dir网络路径时,其排序方式似乎和在本机的不太一样,比较乱,我很不清楚它的排列规则。要是能让dir先把文件夹按从新到旧先排列好,然而再递进其内部,这样就能把最新的goal.htm列在最前头了。
怎么实现呢?先行谢过啊!
[
Last edited by Billunique on 2007-9-22 at 04:07 PM ]
作者: Billunique
时间: 2007-3-22 06:01
补充:
其实可以不用管我说的
文件夹与所需文件goal.htm的对应关系。
只要能把这些文件夹中最新的goal.htm找出来就行,目的只是这个。
向你请教,谢谢!
作者: Billunique
时间: 2007-3-22 10:49
咋没人理会啊,伤心:(~
求助啊,版主们!老大们!namejm、willsort、无奈何、如是大师……!
作者: lxmxn
时间: 2007-3-22 12:37
命令行执行下面的:
(for /f "delims=" %a in ('dir /s/b/a-d %path1%\goal.html') do @echo/%~ta %~a)|sort /r|more >a.txt
作者: Billunique
时间: 2007-3-23 00:19
多谢lxmxn大侠的热心相助!你已经帮我解决了我的问题。但在下还有一些疑惑,想再向你请教一下。
1 在此例中,因我只搜文件,加了 /a-d 是不是比不加速度要快?
2 echo / 与 直接 echo的作用有何区别呢?
3 我查了下,%~a是删除前后引号,%~a比直接%a有什么好处呢,你是出于什么考虑的?
4 其实我想要的只是最新文件的全路径,以为下一步拷贝它作准备。
因为记录在a.txt里的格式是2007-03-05 14:39 \\server\ourfile\……
我在你的基础上
for /f "tokens=3 delims= " %%b in (a.txt) do (copy %%b && goto endfor)
:endfor
(无内容)
实现了把第一个文件拷贝出来。
请问能否让它在a.txt里的时候就只显示路径,却按日期从新到旧排列呢?
多谢大侠!^_^
作者: lxmxn
时间: 2007-3-23 01:46
Re Billunique:
1、加了/a-d 参数可以筛选文件,忽略文件夹,可以提高速度;
2、echo/和echo 的作用差不多;有细微的区别,echo/在命令执行可以输出一空行,而单独的echo 就会显示当前命令提示符的echo 设置状态,是打开还是关闭了;
3、%~a 是个人使用习惯,在这里没有什么作用;
4、在命令行执行:
for /f "tokens=1-3*" %x in ('^(for /f "delims=" %a in ^('dir /s/b/a-d %path1%\*.html'^) do @echo/%~ta %~a^)^|sort /r') do @echo %z >>a.txt
作者: Billunique
时间: 2007-3-23 07:02
哈真好!真是厉害。不过还要请教啊:)
1 我把tokens=1-3*改成tokens=1,2*试了试,发现结果虽然一样,但后者(b.txt)生成的列表文件却比前者(a.txt)要大一些。我看了下,生成文件有30行,而b.txt正好比a.txt大了30个字节。
我想了想,应该跟"1,2*"比"1-3*"多取一个空格有关(第2个和第3个token间有一个空格)但a.txt与b.txt在每行的前头都是一样的,唯一区别就是b.txt比a.txt在文本结束的地方多了一个空格。
为什么这样呢,为什么这个空格自动被转到了文本后头呢?
另外如果那个路径下有的文件夹名字中包含空格,用"1-3*"就取不全了,呵呵是吗?
2 为什么你要用前导符呢?我试了一下,去掉它们是不行的,它们在这起什么作用?
3 for是否有嵌套的限制?我学你的样子,呵就不行了,问题在哪呢?
for /f %%i in ('for /f "tokens=1,2*" %%x in ^('^(for /f "delims=" %%a in ^('dir /s/b/a-d %path1%\%1.htm'^) do @echo/%%~ta %%~a^)^|sort /r'^) do @echo %%z') do (@copy %%i && goto endf)
:endf
希望你不会不胜我烦啊:)
作者: lxmxn
时间: 2007-3-23 09:36
Re Billunique:
1、兄的理解是正确的,如果有空格,就可能取不到完整的路径了;至于为什么后面会多出一个空格出来,想了半天还是没有想出来,兄可以自己研究一下,特别是tokens里面有*的时候,注意区别;
2、加了前导符是为了转义和与外置的for相区别开;
3、对于多个for的嵌套还没有试过,试了变天也没有成功,不知道是for的原因还是我们的命令格式有误;兄可以考虑转义和扩展,看问题能解决么。
作者: Billunique
时间: 2007-3-23 11:33
再傻问一句:
为什么要转义和同外置的for相区分呢?不加上的话命令会失效,那失效的原因又是什么呢?
[
Last edited by Billunique on 2007-3-23 at 11:37 AM ]