搜索目录下的最新文件并将包含该文件的文件夹复制到另一个目录

搜索目录下的最新文件并将包含该文件的文件夹复制到另一个目录

在我的目录中,我有许多同名的文件,也在许多其他子目录中

示例文件结构:

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。对于其他,您可能需要稍微修改目标路径。您可能需要先确保dirnamefindsort、可用awkhead

相关内容