Bash

根據ini文件將文件複製到目的地

  • March 12, 2019

我在一個目錄中有幾千個子目錄,每個子目錄包含一個config.ini文件和一個 JPEG 圖像。ini 文件包含(包括但不限於)對拍攝圖像的時間進行編碼的部分。

[Acquisition]
Name=coating_filtered_001
Comment=Image acquisition
Year=2017
Month=3
Day=21
Hour=13
Minute=2
Second=34
Milliseconds=567

為了這個問題,圖像文件始終具有相同的確切名稱image.jpg

我想將所有圖像文件複製到其他(單個)目錄,並將它們重命名為類似yyyy-mm-ddThh:mm:ss:NNN.jpg或類似的名稱,即由 ini 文件中的時間戳組成的文件名。

這可以在命令行上實現嗎?

可以在命令行上實現,但是在命令行上執行的腳本將是一個更簡單的解決方案(我認為)。

基本步驟:

  • 獲取要迭代的目錄列表:

find ${directory} -mindepth 1 -type d

  • 檢查每個目錄是否存在config.iniimage.jpg

if [ -f ${subdir}/config.ini -a -f ${subdir}/image.jpg ]; then ...

  • 檢查 config.ini 中時間戳的所有正確部分。

各種grep ^Year= ${subdir}/config.ini^Month等…

  • 使用時間戳製作 image.jpg 文件的副本。

cp ${subdir}/image.jpg ${copydir}/${timestamp}.jpg

我認為將這些序列放入腳本中更容易,並且可能更安全,您可以更輕鬆地放入可讀輸出、錯誤處理等。

這是執行這些步驟的範例腳本:

#!/bin/bash

imagepath="/path/to/images"
copydir="/path/to/copies"

# step 1: find all the directories
for dir in $(find ${imagepath} -mindepth 1 -type d); do
   echo "Procesing directory $dir:"
   ci=${dir}/config.ini
   jp=${dir}/image.jpg

   # step 2: check for config.ini and image.jpg
   if [ -f ${ci} -a -f ${jp} ]; then
       # step 3: get the parts of the timestamp
       year=$(grep ^Year= ${ci}   | cut -d= -f2)
       month=$(grep ^Month= ${ci} | cut -d= -f2)
       day=$(grep ^Day= ${ci}     | cut -d= -f2)
       hour=$(grep ^Hour= ${ci}   | cut -d= -f2)
       min=$(grep ^Minute= ${ci}  | cut -d= -f2)
       sec=$(grep ^Second= ${ci}  | cut -d= -f2)
       ms=$(grep ^Milliseconds= ${ci} | cut -d= -f2)

       # if any timestamp part is empty, don't copy the file
       # instead, write a note, and we can check it manually
       if [[ -z ${year} || -z ${month} || -z ${day} || -z ${hour} || -z ${min} || -z ${sec} || -z ${ms} ]]; then
           echo "Date variables not as expected in ${ci}!"
       else
           # step 4: copy file
           # if we got here, all the files are there, and the config.ini
           # had all the timestamp parts.
           tsfile="${year}-${month}-${day}T${hour}:${min}:${sec}:${ms}.jpg"
           target="${copydir}/${tsfile}"
           echo -n "Archiving ${jp} to ${target}: "
           st=$(cp ${jp} ${target} 2>&1)
           # capture the status and alert if there's an error
           if (( $? == 0 )); then
               echo "[ ok ]"
           else
               echo "[ err ]"
           fi
           [ ! -z $st ] && echo $st
       fi
   else
       # other side of step2... some file is missing... 
       # manual check recommended, no action taken
       echo "No config.ini or image.jpeg in ${dir}!"
   fi
   echo "---------------------"
done

對這樣的腳本有點保守總是好的,這樣您就不會意外刪除文件。該腳本僅執行 1 次複製操作,因此非常保守,它不應該損害您的源文件。但您可能希望更改特定操作或輸出消息以更好地滿足您的需求。

引用自:https://unix.stackexchange.com/questions/352846