Bash 用逻辑-数学运算重命名

Bash rename with logical-mathematical operations

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

我的谜语是我想制作类似的东西:

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

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

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

请您尝试以下操作:

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
请确保在执行前创建备份,以免意外丢失您的珍贵照片。

我结束了在 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)))