根据文件命名系统中的修订级别删除重复的 PDF 文件

根据文件命名系统中的修订级别删除重复的 PDF 文件

我正在尝试创建一个批处理、powershell 或任何像我这样的新手可以轻松运行的东西来完成以下任务。任何帮助都将不胜感激。

我在一个文件夹中有几千个 pdf 文件,我想对它们进行分类。问题是该文件夹包含相同 pdf 文档的旧修订版和新修订版。我只想保留每个唯一文档的最新修订版。修订版本通过在文件名末尾添加一个字母 (AZ) 来表示。这是一个示例列表。

670BA-11-001.pdf
670BA-11-001A.pdf
670BA-11-001B.pdf
670BA-12-001.pdf
670BA-15-030C.pdf
670BA-49-120AC.pdf
670BA-49-120AD.pdf
  • 670BA所有文件以“ ”开头
  • 以下数字发生变化。670BA-XX-XXX.pdf
  • 文件名末尾没有字母的文件表示它是原始修订版本
  • 文件名末尾带有字母的文件表示它是修订版本。
  • 修订从……开始A-Z,然后AA-AZ...如此反复。

理想情况下,我希望批处理文件删除旧版本并保留每个唯一文档的最新版本。在这种情况下,输出应如下所示:

670B-11-001B.pdf
670B-12-001.pdf
670B-15-030C.pdf
670BA-49-120AD.pdf

我得到了以下代码,但我相信它是在 unix 中(再次原谅我在这方面缺乏知识)。如果我可以将其转换为 windows 命令,这会起作用吗?

codes=`ls | sort | cut -d'-' -f2 | uniq`
for f in $codes; do old=`ls *-$f-* | head -n -1`; rm -vf $old; done

事情是这样的;

ls | sort lists all the files in lexical order
cut -d'-' -f2 | uniq 

按照“-”分割文件名,从中间抓取 2 位数字,并删除重复项。

ls *-$f-* | head -n -1 

列出除最后一个文件(最新的文件)之外的所有 2 位数字代码的文件。

rm -f $old 

删除那些旧文件,并且 -f 可防止列表为空时失败。

样品运行;

/tmp# touch 601R-11-001.pdf   601R-11-001B.pdf  601R-15-030C.pdf  601R-25-005E.pdf   601R-49-120AD.pdf  601R-11-001A.pdf  601R-12-001.pdf   601R-25-005D.pdf  601R-49-120AC.pdf

/tmp# codes=`ls | sort | cut -d'-' -f2 | uniq`

/tmp# echo $codes
11 12 15 25 49

/tmp# for f in $codes; do old=`ls *-$f-* | head -n -1`; rm -vf $old; done

removed '601R-11-001.pdf'
removed '601R-11-001A.pdf'
removed '601R-25-005D.pdf'
removed '601R-49-120AC.pdf'

答案1

如果你有可用的 Bash 代码(我还没有测试过你文章中的脚本),你可以在 Windows 上运行它在适用于 Linux 的 Windows 子系统上安装 Ubuntu。设置好 Ubuntu 后,您可以使用“开始”菜单中的“Windows 上的 Ubuntu 上的 Bash”项(如果存在)或bash在“运行”框中键入来打开 Bash 提示符。WindowsC:\结构位于/mnt/c/Bash 环境中。

或者,您可以使用 PowerShell!

$revPos = '670BA-XX-XXX'.Length
dir '670BA*.pdf' | group @{e={ $_.Name.Substring(0, $revPos) }} | % {
    $revs = $_.Group | % { $_.Name.Substring($revPos).Split('.')[0] } | group Length | sort -Descending -Property @{e={ [int]$_.Name }} | % { $_.Group | sort -Descending }
    $fileSet = $_.Name
    $revs | % { $fileSet + $_ + '.pdf' } | select -Skip 1 | del
}

让我们按线路和管道组件进行分解:

  1. 为方便起见,存储标识文档的部分的长度,即修订的索引。这假设文档标识符的大小始终相同。
  2. 获取所有文件集。
    • 获取当前目录中所有以 s 开头670BA的文件.pdf
    • 按名称的第一部分(即文档标识符)对它们进行分组。带有 的业务@{e={自定义属性
    • 对这些组进行迭代。
  3. 获取当前组的修订 ID 的排序列表。
    • Group属性位于group命令。
    • 对于组中包含的每个文件对象,选择其名称中位于文档标识符之后但在句点之前的部分.pdf。这是修订标识符。如果文件未修订,则这将是一个零长度字符串。
    • 按长度对修订 ID 进行分组。
    • 根据成员字符串的长度对组对象(而不是其中的项目)进行排序。Name组的属性保存用于对对象进行分组的属性的值。
    • 对于每个组对象,按字母顺序对其成员进行排序。这会将所有组合并到变量中$revs,并根据您的版本控制系统进行排序。
  4. Name将文件组的值存储在不同的变量中以保持其可访问,因为其他 for-eaches( %) 将遮蔽该$_变量。
  5. 删除文档组中除最新修订之外的所有修订。
    • 使用列表中的条目$revs
    • 为每个修订标识符重新编写完整文件名。$_现在保存来自的修订标识符$revs
    • 跳过第一个条目,因为它是最新的条目,也是我们想要保留的条目。
    • 删除与管道中剩余的所有条目相对应的文件。如果你想在不删除任何内容的情况下测试脚本,在此行末尾添加一个空格和-WhatIf开关。在假设模式下,del只会打印它所做的事情。
  6. 结束文档组迭代。

要使用脚本,请将其保存为.ps1文件,例如revnewest.ps1。如果您还没有这样做,请按照启用脚本部分中的说明进行操作PowerShell 标签 wiki。然后你可以将它放在你的文档文件夹中,在那里打开 PowerShell,然后像这样运行它:

.\revnewest.ps1

相关内容