【问题标题】:Bash rename with logical-mathematical operations使用逻辑数学运算重命名 Bash
【发布时间】:2021-08-13 05:21:42
【问题描述】:

我的文件具有以下命名逻辑 .JPEG(旧相机)。例如,DSC01415.JPEG。

我的谜团是我想做这样的事情:

mv DSC{1415..4131}.JPEG DSC{0001..3517}.JPEG

对于任何文件,这具有相同的效果:

mv DSC<number>.JPEG DSC<number-less-1414>.JPEG

【问题讨论】:

  • 把你的谜语变成涂鸦并粘贴在这里。

标签: linux bash rename file-rename mv


【解决方案1】:

我结束了在 closh (clojure-shell) 解决方案中的工作。好玩。而且,可能会用它做更多疯狂的事情。

#!/usr/bin/env closh-zero.jar
  
(defn split-reg [filename reg] 
  (str/split filename (re-pattern reg)))

  
;; ls |> (map #(split-reg % "teste")) |> (map second) |> \
;; (map #(split-reg % ".txt")) |> (map first) |> \
;; (map # (Integer/parseInt %))
  
(defn file-ids [file reg1 reg2]
  (->
   (split-reg file reg1)
   (second)
   ((fn [s] (split-reg s reg2)))
   (first)
   ((fn [s] (Integer/parseInt s)))))

(defn clj-rn [file reg1 arg reg2]
  (sh mv (identity file) (str/join [reg1 arg reg2])))
   

在 closh shell 中,定义这些函数后,

ls |> (map #(file-ids % "DSC" ".JPG")) |> (map #(- % 1414)) |> (map str) |> (map #(clj-rn %1 "foto" %2 ".jpg") 
(sh ls |> (identity)))

【讨论】:

    【解决方案2】:

    请您尝试以下方法:

    for ((i = 1415; i <= 4131; i++)); do
        oldname=$(printf "DSC%04d.JPEG" "$i")
        newname=$(printf "DSC%04d.JPEG" "$((i - 1414))")
        if [[ -f $oldname && ! -f $newname ]]; then
            echo mv -- "$oldname" "$newname"
        fi
    done
    

    如果输出看起来不错,请删除echo
    请务必在执行前创建备份,以免意外丢失您的珍贵照片。

    【讨论】:

    • 这个答案对我来说很好。像这样的循环基本上是在 shell 中执行此操作的唯一方法(无需自定义工具),因为 mv 命令只能有一个目标文件或目录。
    • 您可以通过将mv $oldname $newname 命令更改为ln $oldname new/$newname 来跳过备份,在子目录中创建硬链接。这不会使用额外的空间,但会保留旧文件和新文件。如果新文件名看起来不错,您可以删除旧文件,新文件仍然有效。
    • 非常好。我最终做了一个 closh (clojure/bash interop)。并且,感谢您刷新警告备份您的文件!。我有,但是,当我们在 shell 中处理可变对象时,它总是一个很好的提醒。如果有人对此感到好奇,我将在下面发布我的解决方案。
    • @dgc 感谢您的 commnet。在重命名包含 dsc 等序列号的文件名时,我们需要注意原始名称和新名称之间的重叠。创建硬链接听起来不错,但可能会导致重叠问题。我们可以通过在不同的目录中创建链接来避免它。
    猜你喜欢
    • 2018-05-26
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2014-12-07
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多