我想使用此代碼片段來使用檔案名更新檔案日期和時間戳:
示例檔案名:
2009.07.04-03.42.01.mov
2019.06.08-01.12.08.mov
我收到以下錯誤““運行 Shell 腳本”操作遇到錯誤:“觸摸:超出范圍或非法時間規范:[[CC]YY]MMDDhhmm[.SS]”
我將如何修改此代碼段?
for if in "$@"
do
date_Time=$(echo "$if" | awk '{ print substr( $0, 1, length($0)-7 ) }' | sed 's/\.//g' | sed 's/-//')
touch -t "$date_Time" "$if"
done
更新(01/05/2022):......我還希望代碼適用于以下檔案名格式......
沒有時間資訊的檔案名(時間默認為下午 12 點):
2009.07.04.mov
2019.06.08.mov
以及帶有描述資訊的檔案名:
2009.07.04-file-description.mov
2019.06.08-video-file info.mp4
2019.06.08-video-old-codec.avi
uj5u.com熱心網友回復:
錯誤訊息表明您傳入的檔案名與您的示例不匹配。如果在沒有檔案的情況下呼叫它,可能會修改您的代碼以顯示錯誤訊息,如果它通過目錄名稱傳遞檔案,則洗掉路徑。
順便說if一句,是一個關鍵字,因此您可能不想將其用作變數名,即使它是可能的。
#!/bin/sh
if [ $# == 0 ]; then
echo "Syntax: $0 files ..." >&2
exit 1
fi
for f in "$@"
do
date_Time=$(echo "$f" | awk '{ sub(/.*\//, ""); gsub(/[^0-9] /, ""); print substr( $0, 1, length($0)-7 ) }')
touch -t "$date_Time" "$if"
done
還要注意我是如何分解sed腳本的;awk 可以做所有sed可以做的事情,所以我在主腳本中包含了最終的轉換。(順便sed 's/[-.]//g'說sed -e 's/\.//' -e 's/-//'一句,可以一次性完成;或者您可以通過一次sed呼叫來完成。)
如果你使用 Bash,你可以進一步簡化:
#!/bin/bash
if [ $# == 0 ]; then
echo "Syntax: $0 files ..." >&2
exit 1
fi
for f in "$@"
do
base=${f##*/}
dt=${base//[!0-9]/}
dt=${dt:0:12}
case $dt in
[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
touch -t "$dt" "$f";;
*) echo "$0: $f did not seem to contain a valid date ($dt)" >&2;;
esac
done
另請注意,如果無法從檔案名中準確提取 14 位數字,代碼現在如何發出警告。的引數擴展是有些笨拙但很多比呼叫awk中對每個檔案名分別(以及在awk代碼不是特別優雅或健壯任一反正)更有效。
uj5u.com熱心網友回復:
快速小巧的 bash 功能
setDateFileFromName() {
local _file _dtime
for _file ;do
_dtime="${_file%.*.mov}"
_dtime="${_dtime##*/}"
touch -t ${_dtime//[!0-9]/} "$_file"
done
}
然后
setDateFileFromName /path/to store dir/????.??.??-??.??.??.mov
評論。這適用于您的樣本格式的檔案名。檔案名格式的任何更改都會破壞這一點!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405187.html
標籤:
上一篇:帶有contextMenu的macOSSwiftUI表
下一篇:在本地創建的隱藏.git檔案夾
