在我的目录中,我有许多同名的文件,也在许多其他子目录中
示例文件结构:
C:\a\第一\hello.txt
C:\a\第二\hello.txt
C:\a\第三\hello.txt
我需要专门搜索最近修改的“hello.txt”(因为目录中还有其他文件)并将其包含的文件夹复制到C:\b
我对批处理很陌生,所以解释一下就好了:)
答案1
这是一组笨拙的命令,毫无疑问有人比我更聪明(例举) 会把它变成更小更简洁的东西,但有时在学习观察所有齿轮旋转的同时,这样做会更好。
此批处理文件或“脚本”依赖于切,头, 和sed来自 Windows 核心实用程序(开源)http://gnuwin32.sourceforge.net/packages/coreutils.htm如果您想进行任何类型的批处理文件写入,它都会让您的生活变得非常轻松。
C:
cd \a
del temp.tmp
for /f "eol=: delims=" %%F in ('dir hello.txt /b /s') do @echo %%~tF %%F >> temp.tmp
sort /r temp.tmp > result.tmp
head -1 result.tmp > temp.tmp
cut -d: -f 3 temp.tmp | sed s/hello.txt// > temp.tmp
set /p SOU=<temp.tmp
CD %SOU%
copy *.* C:\b\
dir c:\b
说什么?下面是一些评论,从第四行开始,我做了一些调整(程序员很少会说偷了)来自天才在……之上堆栈溢出:
for /f "eol=: delims=" %%F in ('dir hello.txt /b /s') do @echo %%~tF %%F >> temp.tmp
创建一个名为的工作文件温度.tmp逐行构建,列出每一个你好.txt当前目录下的文件;每行以日期和时间开头你好.txt随后绝对路径到你好.txt 看起来像
2018 年 10 月 5 日 09:27 C:\a\1\hello.txt
2018 年 10 月 5 日 09:29 C:\a\2\hello.txt
2018 年 10 月 5 日 09:32 C:\a\3\hello.txt
sort /r temp.tmp > result.tmp
取内容温度.tmp并按相反的顺序对它们进行排序,将它们写入结果.tmp,覆盖之前的内容(如果有的话),或者如果没有,则创建文件结果.tmp,得到:
2018 年 10 月 5 日 09:32 C:\a\3\hello.txt
2018 年 10 月 5 日 09:29 C:\a\2\hello.txt
2018 年 10 月 5 日 09:27 C:\a\1\hello.txt
head -1 result.tmp > temp.tmp
做了一些 Windows 不知道该怎么做的事情,所以我们必须得到免费啤酒 开源 GNU 核心实用程序包得到头命令,这里只取第一行结果.tmp并将其写入温度.tmp,覆盖温度.tmp之前 (单曲 >“重定向”运算符覆盖;>> 运算符连接并添加到文件中已有的内容),从而得到:
2018 年 10 月 5 日 09:32 C:\a\3\hello.txt
cut -d: -f 3 temp.tmp | sed s/hello.txt// > temp.tmp
此行使用切仅回显第三个字段(省略日期和时间)温度.tmp和‘管道’将它转移到另一个小程序,sed,这是非常棒仅仅用语言无法解释它能做的一切。在这里我们用它来寻找你好.txt并将其从我们发现的内容中删除温度.tmp,然后将其发送以覆盖温度.tmp;现在它只包含最新实例的路径你好.txt即:
\a\3\
(如果你愿意,你可以将第 5、6 和 7 行合并为一行
sort /r temp.tmp | head -1 | cut -d: -f 3 | sed s/hello.txt// > temp.tmp
但为了教学目的,我在这里将它们分开。
好的,现在我们有了要复制的文件目录的绝对路径,位于温度.tmp但我们需要在批处理文件中使用它,因此使用命令
set /p SOU=<temp.tmp
我们放一个变量,苏,其中的内容温度.tmp。
CD %SOU%
将工作目录更改为你好.txt是,并且
copy *.* C:\b\
将其文件复制到驱动器 C 上的 \b:
我是怎么做到的?主要是站在巨人的肩膀上:我开始知道我需要做的是列出所有你好.txt文件,一个列表,其中显示了每个文件的创建日期和时间,后面跟着绝对路径。一旦我有了这个,我就开始把它切碎,直到我只剩下最新的你好.txt,并丢弃了所有不是复制文件路径的东西。有点像爱斯基摩雕刻家把所有看起来不像海象的东西都切掉。
注意:逐行测试时,对变量使用单个 %;一旦它工作正常,并将其放入批处理文件中,就会使用双 %%,这让我非常困惑,直到我读到提到它的解释。
答案2
如果您有权访问 bash(可能通过 cygwin、WSL、min-gw 等),这里有一行代码(假设您已经在所需的父目录中):
cp $(dirname `find . -type f -exec ls -l {} --time-style=+%s \; | sort -nrk 7 | awk '{print $8}' | head -1`)/* "c:\b"
假设使用的是 cygwin。对于其他,您可能需要稍微修改目标路径。您可能需要先确保dirname
、find
、sort
、可用awk
head