如何使“dir”和“copy”命令对“*.xyz”进行操作但不对“*.xyz~”进行操作?

如何使“dir”和“copy”命令对“*.xyz”进行操作但不对“*.xyz~”进行操作?

当我使用copy *.txt somefolder\系统时,它似乎*.txt~也复制了所有文件,这不是我想要的。使用以下命令可以看到类似的效果dir

C:\Users\Paul\Documents\Programs\Proffy>dir *.txt
 Volume in drive C is Vista
 Volume Serial Number is EC23-AD6B

 Directory of C:\Users\Paul\Documents\Programs\Proffy

29/11/2008  13:54            35,821 COPYING.txt
31/10/2009  21:54             1,644 INSTRUCTIONS.txt
06/06/2009  15:57             1,393 INSTRUCTIONS.txt~
04/01/2009  11:59               116 Notes.txt
19/04/2009  16:53               134 README.txt
04/01/2009  12:42               132 README.txt~
31/10/2009  21:30               197 TODO.txt
31/10/2009  19:10               414 TODO.txt~
               8 File(s)         39,851 bytes
               0 Dir(s)  41,938,862,080 bytes free

C:\Users\Paul\Documents\Programs\Proffy>

我如何才能获得dir并仅对以 和而不是copy结尾的文件进行操作?.txt.txt~

答案1

显然,外壳考虑到了短通配符扩展的长名称。可以在以下位置找到更详细的解释shf301 的回答。这很不幸,可能是 DOS 的旧时代遗留下来的,因为 DOScmd毕竟是试图兼容的——某种程度上。

这里有几个选项:

  1. 使用forfiles,其对于通配符扩展具有不同的语义:

    forfiles /m *.txt /c "cmd /c copy @file foo"
    

    该功能至少在 Vista 及更高版本上可用。

  2. 使用for并检查扩展:

    for %a in (*.txt) do @if %~xa==.txt @copy "%i" foo
    

    不幸的是,仅使用通配符扩展for也会返回任何带有扩展名的文件.txt~。这就是为什么我们需要再次检查扩展名。

  3. 使用xcopy. 虽然xcopy具有与 shell 相同的通配符扩展语义,但您可以为其提供一个要忽略的名称的文件:

    echo .txt~>tmpfile
    xcopy *.txt foo /exclude:tmpfile
    del tmpfile
    
  4. 使用robocopy. 虽然robocopy具有与 shell 相同的通配符扩展语义,但您可以为其提供要忽略的文件/通配符列表:

    robocopy . foo *.txt /XF *.txt~
    
  5. 使用fordirfindstr的适当组合。这实际上只是过滤掉所有以 结尾的行~,并对其余行进行操作。if我认为上面的变体更优雅。

    for /f "usebackq delims=" %i in (`dir /b *.txt ^| findstr /r "[^~]$"`) do @copy "%i" foo
    
  6. 只是为了完整性:PowerShell:

    Copy-Item *.txt foo
    

答案2

我的解决方案是del *.xyz~先执行copy *.xyz。虽然不是很出色,但确实有效。

答案3

我不确定如何停止dir/copy仅匹配*.txt,但我可以解释为什么*.txt会返回它所做的;它匹配所有以 .txt 结尾的短文件名,执行 adir /x *.txt以查看这一点。这个问题发生在以相同的前三个字符开头的每一组扩展名中(例如*.htm将匹配 htm、html 甚至 htmlasdfasdf)。

此外,大多数 Windows 应用程序都会这样做,因为操作系统提供的 API 可以搜索文件查找第一个文件匹配长文件名和短文件名。引用:

搜索包括长文件名和短文件名。

您必须按照 Johannes Rössel 的回答建议进行某种自定义过滤。

答案4

现有的答案封面只是复制文件掉了,但没有列出它们。

您可以使用存档位两者兼而有之。尽管它旨在与复制1,它还适用于目录2

脚步:

  1. 确保所有.txt文件都设置了存档位:

     ATTRIB +A *.txt
    
  2. 从所有文件中删除存档位.txt~

     ATTRIB +A *.txt~
    
  3. 列出所有.txt设置了存档位的文件:

     DIR /AA *.txt
    

    或将其复制到somefolder

     XCOPY /A *.txt somefolder/
    

1 XCOPY 使用/A开关排除所有未设置存档位的文件。这可用于从每日备份中排除某些文件(例如临时文件)。使用此/M开关,它还会从文件中删除存档位,这在将文件复制到小型存储设备(例如软盘)时非常方便。此外,修改文件会自动设置存档位,因此开关/M可用于增量备份。

2 DIR /AA仅显示已设置存档属性的文件。

相关内容