我希望标题有点易于理解......
我想扫描一个大文件夹(包括子文件夹)以获取特定文件列表,并将它们复制到新位置。到目前为止,我已经找到了以下几行代码:
@echo off &setlocal
set "sourceRoot=E:\source folder\"
set "sourceList=list of file names.txt"
set "destFolder=C:\destination folder\
for /f "delims=" %%i in ('dir /a:-d /b /s "%sourceRoot%\*.jpg"^|findstr /ig:"%sourceList%"') do (
copy "%%~i" "%destFolder%\"
)
PAUSE
这很好用,但自然会一直复制包含“sourceList”中一行的所有文件。 (例如,如果我要复制“saber.jpg”,它还会复制“light saber.jpg”和“sabertooth.jpg”) 我发现并尝试了像“^”和“$”或“/ b”和“/ e”这样的命令来告诉代码结果应该以搜索字符串开始和结束 - 但无济于事。 可悲的是,我没有任何编码知识,广泛的谷歌搜索没有让我比这更进一步。
有没有办法确保只复制名称为.txt文件整行的IDENTICAL的文件?
第二个问题:
在不同的子文件夹中,有些文件具有相同的名称(它们是相应文件的不同版本)。每当我运行代码时,它们似乎都会相互覆盖 - 为每个文件名留下一个版本。 理想情况下,我希望复制所有不同版本并为副本提供扩展名,以便它们可以共存于目标文件夹中。 (例如“saber”,“saber1”,“saber2”等)
我想提前感谢大家的帮助和想法! :)
亲切的问候
马尔特
(如果它以任何方式重要:我使用的是Windows 7)
答案 0 :(得分:1)
这仅指第一个问题,但不是您在问题中提到的第二个问题!
鉴于文件list of file names.txt
仅包含纯文件名但没有文件路径,/E
搜索可以通过findstr
选项锚定到每行的末尾,但它不能锚定到开头,因为您将绝对路径提供给/S
而不是纯文件名,因为findstr
在提供list of file names.txt
选项时返回完整路径。
您可以做的是在\\
之前的每个文件名前加findstr
,这是...
set "sourceList=list of file names.txt"
set "tempList=%TEMP%\augmented list.tmp"
...
> "%tempList%" (
for /F "usebackq delims= eol=|" %%L in ("%sourceList%") do (
echo(\\%%L
)
)
...
的转义字面反斜杠,而后者又是Windows路径分隔符。
findstr
然后调整您的管道/L
命令行(添加 dir /A:-D /B /S "%sourceRoot%\*.jpg" ^| findstr /L /I /E /G:"augmented list.tmp"
以强制文字搜索):
...
del "%tempList%"
最后,完成复制后,清理临时列表文件:
<?xml version='1.0' encoding='UTF-8'?>
<wd:Report_Data
xmlns:wd="urn:com.workday.report/CIS_CR_INT122_HMS_Dependent_Report">
<wd:Report_Entry>
<wd:Dependents>
<wd:project_id>2269</wd:project_id>
<wd:plan_id>5909</wd:plan_id>
<wd:employee_client_id>JA5637</wd:employee_client_id>
</wd:Dependents>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Dependents>
<wd:project_id>2269</wd:project_id>
<wd:plan_id>5909</wd:plan_id>
<wd:employee_client_id>JA4345</wd:employee_client_id>
</wd:Dependents>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Dependents>
<wd:project_id>2269</wd:project_id>
<wd:plan_id>5909</wd:plan_id>
<wd:employee_client_id>JA5637</wd:employee_client_id>
</wd:Dependents>
</wd:Report_Entry>
</wd:Report_Data>
答案 1 :(得分:0)
第一个问题:
/b
代替exact match
等,意味着findstr /?
(请参阅提示中的copy "%%~i" "%destFolder%\"
)
而不是if exist "%destFolder%\%%i" (
set "copied="
for /L %%c in (2,1,7000) do if not defined copied if not exist ""%destFolder%\%%~ni%%%c%~xi" copy "%%~i" "%destFolder%\%%~ni%%%c%~xi"&set "copied=Y"
) else (
copy "%%~i" "%destFolder%\"
)
copied
首先,查看原始目标文件名是否存在。如果没有,请复制该文件。
如果是,请清除标志值%%c
,并循环copied
= 2到7000步骤1 :(如果未设置copied
标志且文件名为basename %% c.extension不存在,然后复制到basename %% c.extension并设置为将for
标记为值)
for /?
文档
%%~ni
来自提示符的将显示元变量修饰符是什么(%%i
= %%~xi
的名称部分,%%c
=扩展部分等等。)if defined
是只是一个带有递增数值的字符串。
请注意 try{
Config conf = new Config();
conf.useSingleServer().setTimeout(3600000);
conf.useSingleServer().setRetryInterval(3600000);
conf.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(conf);
RMap<String,Object> map = redisson.getMap("myCache");
MyClass myObject; // This is the big complex object.
map.put("key", myObject);
redisson.shutdown();
}catch (Exception ex) {
ex.printStackTrace();
}
对变量的运行时值进行操作,以便它可以作为标志。