iT邦幫忙

0

求 一段 Code,linux 或 dos,都可以。

小弟實在不熟語法,故求一段Code

背景:
掃描器掃出來的檔案,會自動存到固定的資料夾,其自動命名方式常為 "scan001.pdf" ..., 數字跑流水號下去。

目標:
希望用工程排程器 自動把檔名變成 "檔案的建立日期" 如 20210305180000.pdf

code 是 linux code 或 dos指令都可以。

感恩

Linux 沒有所謂的建立日期,只有最後修改日期、最後訪問日期
感謝指導
1
過時軟碟片
iT邦新手 5 級 ‧ 2021-03-09 13:31:57
最佳解答

用linux的bash script

#!/bin/bash
WORK_PATH="/the/path/of/scan/pdf/files"
for WORK_FILE in "$WORK_PATH"/scan[0-9][0-9][0-9]\.pdf; do
  if [ -e "$WORK_FILE" ]; then
    mv "$WORK_FILE" \
      "$(date -d "$(stat -c %y "$WORK_FILE")" +%Y%m%d%H%M%S).pdf"
  fi
done

樓上已經有人提到在linux並沒有檔案的creation time,所以這裏是用modification time。

另外有人提到如果在1秒內有多於1個掃描檔的情況下會撞名,那麼一個方法是將檔名的秒數精確到十分位或百分位或千分位,另外一個方法是加流水號。最相容的方法應該是加流水號

#!/bin/bash
WORK_PATH="/the/path/of/scan/pdf/files"
for WORK_FILE in "$WORK_PATH"/scan[0-9][0-9][0-9]\.pdf; do
  if [ -e "$WORK_FILE" ]; then
    WORK_FILE_NEW="$(date -d "$(stat -c %y "$WORK_FILE")" +%Y%m%d%H%M%S)"
    if [ -e "$WORK_FILE_NEW".pdf ]; then
      NEW_SN=2
      while [ -e "$WORK_FILE_NEW"-${NEW_SN}.pdf ]; do
        let NEW_SN++
      done
      mv "$WORK_FILE" "$WORK_FILE_NEW"-${NEW_SN}.pdf
    else
      mv "$WORK_FILE" "$WORK_FILE_NEW".pdf
    fi
  fi
done

這裏是在有撞名時才開始加流水號,流水號從2開始。

所以只要擇一把WORK_PATH設定到pdf檔案的目錄然後存起來再加個可執行屬性就行了。不過呢,提供的script幾乎沒有錯誤檢查,有需要的話樓主要自己加強一下了。

非常感謝,我正需要的是這個。
不過在測試中發生了個悲劇,目前正在解救。
只測試第一段code時,似乎與會跑進某個無窮迴圈,重開機也沒辦法取消。
之後有解決了再繼續測試,感恩。

1
舜~
iT邦高手 1 級 ‧ 2021-03-05 23:16:41

不過微軟的創建時間好像只到分,這樣不知道會不會有檔名重複的問題

先吸收一下

1
utap2001
iT邦新手 5 級 ‧ 2021-03-06 19:25:13

在linux裡面先用stat取得creation time
然後在用date轉成你要的格式

date +%Y%m%d%H%M%S -d "$(stat -c %x xxx.txt)"

最後在重新命名
rm or rename

https://unix.stackexchange.com/questions/285897/get-file-modification-time-in-a-specific-format-yyyymmddhh24miss

先吸收一下

1
japhenchen
iT邦大師 1 級 ‧ 2021-03-08 10:41:02

何不用python當sh或進階版的批次檔看待?I/O跟資料庫的資源都十分齊全,你要做的【掃描→文字辨識→檔名編成→轉檔→儲存】也游刃有餘,linux/WindowsCMD也都能用,語法也比Linux bash script/DOS BATCH更好閱讀

先吸收一下

個人覺得python固然很強大但是並不是所有開發環境或應用環境都有能力提供python,其實像樓主這樣並不複雜的問題使用shell script是蠻適合的。

我要發表回答

立即登入回答