尝试使用CMD(窗口)递归搜索文件名中包含特定单词的文件

时间:2012-06-05 15:59:08

标签: batch-file cmd

我正在尝试编写一个脚本,该脚本将在文件夹中递归搜索所有文件,并在每个文件上运行命令和/或命令列表。以下是我需要它如何工作的示例:

  • 在文件夹中搜索包含“1080p”的文件
  • 将此文件复制到本地目录,但从文件名中删除“1080p”
  • 对这些文件运行另一个批处理脚本(我已经有那部分工作)

所有这一切都需要自动化。

我需要在Windows命令提示符下执行此操作,并且我愿意使用所需的任何其他程序 我已经在类似的批处理脚本中使用了SED。

2 个答案:

答案 0 :(得分:3)

@echo off
setlocal disableDelayedExpansion

set "src=sourcePath"
set "dst=destinationPath"
set "search=1080p"

for /r "%src%" %%F in (*%search%*) do (
  set "full=%%~fF"
  set "name=%%~nxF"
    setlocal enableDelayedExpansion
    copy "!full!" "%dst%\!name:%search%=!"
    endlocal
)
REM call your batch script here to process the copied files

如果多个源文件夹中存在相同的文件名,则可能会出现问题。但这是您所述要求的一般问题。

说明:

%%~fF提供%% F

中包含的文件的完整路径

$$~nxF仅提供%% F

中包含的文件的名称和扩展名

输入HELP FORFOR /?,了解有关FOR变量扩展的修饰符的更多信息。

!name:%search%=!使用延迟扩展来搜索名称的内容,并用任何内容替换搜索值。在此示例中,%search%= 1080p。请注意,搜索不区分大小写。

我需要在循环中进行搜索和替换时使用延迟扩展,因为在解析语句时会使用百分比进行正常扩展。但是整个FOR构造(包括括号的内容)被解析为一个逻辑语句。因此,正常扩展将在循环执行之前给出name的值。这不起作用:-)延迟扩展在每次执行行时都会给出当前值。

键入HELP SETSET /?,了解有关搜索和替换以及延迟展开的详情。

我需要打开和关闭延迟扩展,因为!是文件名中的有效字符,而%% F扩展会破坏该值(如果它包含!

答案 1 :(得分:2)

我建议使用cygwin轻松利用一些常见的Unix实用程序,尽管你可以逐个找到Windows编译版本(即perl):

按名称查找文件列表,对每个文件执行命令:

find . -name \*1080p\* | xargs <command>

查找文件列表,创建移动/重命名命令列表以去除“1080p”字符串:

find . -name \*1080p\* | perl -ne 'chomp();$x=$_;s/1080p//g;print"cp $x /target/$_\n"'
# add "| sh" to run the commands, or "> commands.sh" to generate a script

应该在CMD中运行的命令只需要PERL

dir /s /b | perl -ne 'chomp();$x=$_;s/1080p//g;print"copy $x c:\target\$_\n"' > cmds.bat

当然,调整脚本可以满足您的需求。但是,我相信这将实现您的目标。使用Windows CMD可能有一种聪明的方法,但我不是CMD专家。 Unix实用程序(恕我直言)要简单得多!