如何删除只有4个字符的文件?

时间:2012-08-15 15:45:28

标签: batch-file batch-processing

我使用的是Windows 7,我想构建一个批处理文件来完成以下任务:

删除C:\images目录中名称中包含4个字符的所有文件。 例如。 1234.jpg 7123.jpg,8923.jpg,7812.jpg,1245.jpg,0067.jpg,0001.jpg,0010.jpg,0060.jpg等。

这可能吗?

3 个答案:

答案 0 :(得分:2)

此解决方案将删除点前面的名称部分有4个字符的所有文件,以及可能在点之前具有较短部分的文件。

ERASE C:\images\????.*
  • ?代表任何角色(或者有时根本没有角色,见下文)
  • *代表任何字符序列。

有哪些不同的Windows版本?

在Windows 98下(我有一种直觉,这对于“纯”DOS版本也是有效的,不支持长FAT名称,包括win95和更早版本,也许是Windows Millennium),{{1}代表一个字符。

基于@ dbenham的评论,我在Windows的更高版本中得到了它,?代表0或1个字符。

FAT短名称怎么样?

现在对于棘手的部分:带有前导点的名称(即第一个点之前的0个字符)怎么样?有多个点的文件怎么样?

在执行任何操作之前会删除尾随点,因此?的扩展名为abc.def.....,其基数为def

点位于短名称中的固定位置,即使没有扩展名的文件也存在。这就是abc匹配所有文件的原因,即使是那些没有扩展名的文件。

超短的FAT名称(也称为DOS名称)中的前导点,多个点,超过3个字符的扩展名和超过8个字符的基数(在点之前)部分无效,因此一个长名称的文件(显示在Windows)其中一个将有一个简短的短名称,看起来像*.*,其中:

  • POBASE~N.POE是基础的一部分(通常是开头,删除了不寻常的字符),
  • POBASE是一个字面的波形符,
  • ~是一个或多位数字,通常是与现有名称不冲突的最小数字,
  • N是扩展程序的一部分(通常是开头,删除了不常见的字符),其中扩展名是最后一个点后面的部分,
  • 并且所有部分都是大写字母或数字。

我按顺序创建了以下文件:

  • POE的简称.ab
  • AB~1的简称a.b.c
  • AB~1.C的简称a.bcde
  • A~1.BCD(注意空格)的名称为a.x y
  • a.xy的简称..ab,因为AB~2已经存在(第一个例子)
  • AB~1a.ba.b.a.b..都是同一文件的等效名称(即创建a.b...将覆盖a.b...如果它存在)。

在旧的Windows 98系统上运行命令a.b时,将匹配以下文件:

  • dir ????.*,名称为AB~1
  • .ab,名称为AB~1.C
  • a.b.c,名称为AB~2

现在,虽然Vista和7试图将大部分DOS遗留在窗外(双关语),但仍有一些残余:如果你在浏览器窗口的地址栏中输入..ab,你就是' ll进入(半成熟的本地化变体)C:\PROGRA~1,如果你插入FAT格式的USB密钥,文件将有短名称。我不确定这些通配符是否与这些短名称匹配,但这里有一些“有趣”的事实,这表明它甚至不值得调查:

有趣的事实

  • 在法语版的Windows 7中,C:\Program files将在资源管理器中显示为C:\Program files,但如果您尝试C:\Programmes,则会失败,因此已翻译的名称不会似乎被命令行使用。
  • 在同一台Windows 7上,cd C:\Programmes(8.1问号)将与????????.?(只有5个字符)匹配,但更短(如a.b.c带有7.1个问号)不会匹配它。
  • 在同一个Windows 7上,???????.?将匹配????????.?,但foo中没有任何点。

结论

总而言之,如果您想编写一个程序,可以在第一个(或最后一个)点之前可靠地删除四个字符的文件,请使用其他一些解决方案,不要使用通配符。

但是,请注意,较旧的Windows版本没有所有那些花哨的脚本编写功能来获取具有笨拙语法的字符串的长度(我的意思是,严重的是,foo,它几​​乎和{一样糟糕} {3}}

如果Windows没有三层文件命名(FAT短名称,“实际”文件名和翻译文件名),如果他们没有选择更改其含义,那么这一切都会变得如此简单if "!n:~3,1!" neq "" echo del "%%F"

答案 1 :(得分:1)

这将删除任何名称正好4个字符(不包括扩展名)和任何扩展名的文件 例如:del4chrs "C:\DATA\Junk Folder"

@echo off
setlocal enabledelayedexpansion
if "%1" == "" (
  echo Usage del4chrs {folder}
  goto :eof
)
if not exist "%~1\nul" (
  echo Folder not found.
  goto :eof
)
pushd "%~1"
for %%F in (????.*) do (
  set n=%%~nF
  if "!n:~3,1!" neq "" echo del "%%F"
)

答案 2 :(得分:0)

我相信这是删除基本名称忽略扩展名正好为4个字符的所有文件的最简单的解决方案: EDIT - 我从DIR命令中删除了掩码,因为FINDSTR无论如何都在进行真正的过滤 < / p>

for /f "eol=: delims=" %%F in ('dir /b /a-d^|findstr /rx "....\.[^.]* ...."') do del "%%F"

很容易修改解决方案,只删除由4位数字组成的文件(忽略扩展名)

for /f "eol=: delims=" %%F in ('dir /b /a-d^|findstr /rx "[0-9][0-9][0-9][0-9]\.[^.]* [0-9][0-9][0-9][0-9]"') do del "%%F"