Bash
根據ini文件將文件複製到目的地
我在一個目錄中有幾千個子目錄,每個子目錄包含一個
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.ini
和image.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 次複製操作,因此非常保守,它不應該損害您的源文件。但您可能希望更改特定操作或輸出消息以更好地滿足您的需求。