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