仅重命名唯一文件

Rename only unique files

如何通过从文件名中删除“1”来重命名唯一文件并保留重名文件?

输入:

-english_1.pdf  
-english_2.pdf  
-english_3.pdf  
-mathematics_1.pdf  
-theology_1.pdf  
-economics_1.pdf  
-economics_2.pdf

如何使用 , 或类似的方法从 mathematics_1.pdf 和 theology_1.pdf 中删除 1

期望输出:

-english_1.pdf  
-english_2.pdf  
-english_3.pdf  
-mathematics.pdf  
-theology.pdf  
-economics_1.pdf  
-economics_2.pdf

我试过了:

rename -n  's/1//' *.pdf

但它删除了 所有 1

一个安全的赌注可能是以下方法:

for file in *_1.pdf; do
   [ -f "${file/_1.pdf/_2.pdf}" ] || mv "${file}" "${file/_1.pdf/.pdf}"
done

它的作用如下:

  • for file in *_1.pdf; do ... done: 对所有匹配 glob 模式 *_1.pdf 的文件进行循环。所以这匹配所有看起来像 prefix_1.pdf
  • 的文件
  • [ -f "${file/_1.pdf/_2.pdf}" ]: 我们在循环中做的第一件事是验证是否存在名称为 prefix_2.pdf 的类似文件.我们通过参数 expansion

    获得这个文件名

    ${parameter/pattern/string}: Pattern substitution. The pattern is expanded to produce a pattern just as in pathname expansion, Parameter is expanded and the longest match of pattern against its value is replaced with string.

    source: man bash

    test 命令,写作 [ -f filename ] 检查是否存在带有 filename 的文件。有关详细信息,请参阅 man test

  • 如果上面的测试成功,我们什么都不做。如果上述测试不成功,我们使用 mv "${file}" "${file/_1.pdf/.pdf}" 重命名原始文件。这个条件组合是在 OR-list 上使用实现的:

    An OR list has the form command1 || command2. command2 is executed if, and only if, command1 returns a non-zero exit status.

    source: man bash

我在这里假设如果 prefix_3.pdf 存在,则文件 prefix_2.pdf 必须存在。

您可以通过在 mv 命令之前添加 echo 来验证上述内容。