仅重命名唯一文件

Kar*_*ziz 0 shell rename sh

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

输入:

-english_1.pdf  
-english_2.pdf  
-english_3.pdf  
-mathematics_1.pdf  
-theology_1.pdf  
-economics_1.pdf  
-economics_2.pdf
Run Code Online (Sandbox Code Playgroud)

如何使用或类似工具从math_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
Run Code Online (Sandbox Code Playgroud)

我试过:

rename -n  's/1//' *.pdf
Run Code Online (Sandbox Code Playgroud)

但它会删除所有1

kva*_*our 5

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

for file in *_1.pdf; do
   [ -f "${file/_1.pdf/_2.pdf}" ] || mv "${file}" "${file/_1.pdf/.pdf}"
done
Run Code Online (Sandbox Code Playgroud)

它的作用如下:

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

    ${parameter/pattern/string}:模式替换。将 pattern 被扩展,以产生图案,就像路径扩展,参数被膨胀和最长匹配pattern针对其值被替换为string

    来源: man bash

    test命令编写为[ -f filename ]检查文件是否filename存在。有关man test更多信息,请参阅。

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

    OR 列表的形式为command1 || command2command2当且仅当command1返回非零退出状态时才执行。

    来源: man bash

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

您可以通过echomv命令前添加来验证上述内容。