使用 sed 或 awk 重命名多个文件
Renaming multiple files using sed or awk
我有一个 DVR 录像机,可以将文件发送到我的 linux ftp 服务器,但我需要更改为另一种名称格式,以便它们可以在旧软件上使用。
原始文件采用这种格式:
DVR_ch1_principal_20150427094000_20150427100000.dav
DVR=Device Name
ch1=channel#
principal=stream type
20150427094000=starting date in year,month,day,hour,minute,second format
20150427100000=end date in year,month,day,hour,minute,second format
我需要将文件夹中的所有文件修改为这种格式:
ch1_09.04.00-10.00.00.dav
ch1=channel#
09.04.00=starting time in hh.mm.ss
10.00.00=end time in hh.mm.ss
我知道可以用 sed 或 ark 来完成,但这超出了我的知识范围。
提前致谢
sed -n '
# ch1_09.04.00-10.00.00.dav
/^DVR_ch/ {
s/.*\(ch[0-9]\{1,\}\).*\([0-9]\{6\}\)_.*\(([0-9]\{6\}.\{4\}\)$/--
s/\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)/\..\
/g
p
}
#ch1=channel
/=channel/ p
#=starting date
/=starting date/ s/[0-9]*\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)=.*/\
..=starting time in hh.mm.ss/p
#=end date
/=starting date/ s/[0-9]*\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)=.*/\
..=end time in hh.mm.ss/p
' YourFile
自我评论(posix 版本所以在 linux GNU sed 中的'--posix')
它主要是重新格式化第
行的信息
AWK&bash 版本:
for FNAME in $(ls -1 *.dav)
do
channel=$(echo ${FNAME} | awk -F _ '{print }')
starttime=$(echo ${FNAME} | awk -F _ '{print }')
endtime=$(echo ${FNAME} | awk -F _ '{print }')
#
echo ${channel}
#
STARTH=${starttime:8:2}
STARTM=${starttime:10:2}
STARTS=${starttime:12:2}
ENDH=${endtime:8:2}
ENDM=${endtime:10:2}
ENDS=${endtime:12:2}
#
echo ${channel}"_"${STARTH}"."${STARTM}"."${STARTS}"-"${ENDH}"."${ENDM}"."${ENDS}".dav"
mv -f ${FNAME} ${channel}"_"${STARTH}"."${STARTM}"."${STARTS}"-"${ENDH}"."${ENDM}"."${ENDS}".dav"
done
我有一个 DVR 录像机,可以将文件发送到我的 linux ftp 服务器,但我需要更改为另一种名称格式,以便它们可以在旧软件上使用。 原始文件采用这种格式:
DVR_ch1_principal_20150427094000_20150427100000.dav
DVR=Device Name
ch1=channel#
principal=stream type
20150427094000=starting date in year,month,day,hour,minute,second format
20150427100000=end date in year,month,day,hour,minute,second format
我需要将文件夹中的所有文件修改为这种格式:
ch1_09.04.00-10.00.00.dav
ch1=channel#
09.04.00=starting time in hh.mm.ss
10.00.00=end time in hh.mm.ss
我知道可以用 sed 或 ark 来完成,但这超出了我的知识范围。
提前致谢
sed -n '
# ch1_09.04.00-10.00.00.dav
/^DVR_ch/ {
s/.*\(ch[0-9]\{1,\}\).*\([0-9]\{6\}\)_.*\(([0-9]\{6\}.\{4\}\)$/--
s/\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)/\..\
/g
p
}
#ch1=channel
/=channel/ p
#=starting date
/=starting date/ s/[0-9]*\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)=.*/\
..=starting time in hh.mm.ss/p
#=end date
/=starting date/ s/[0-9]*\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)=.*/\
..=end time in hh.mm.ss/p
' YourFile
自我评论(posix 版本所以在 linux GNU sed 中的'--posix') 它主要是重新格式化第
行的信息AWK&bash 版本:
for FNAME in $(ls -1 *.dav)
do
channel=$(echo ${FNAME} | awk -F _ '{print }')
starttime=$(echo ${FNAME} | awk -F _ '{print }')
endtime=$(echo ${FNAME} | awk -F _ '{print }')
#
echo ${channel}
#
STARTH=${starttime:8:2}
STARTM=${starttime:10:2}
STARTS=${starttime:12:2}
ENDH=${endtime:8:2}
ENDM=${endtime:10:2}
ENDS=${endtime:12:2}
#
echo ${channel}"_"${STARTH}"."${STARTM}"."${STARTS}"-"${ENDH}"."${ENDM}"."${ENDS}".dav"
mv -f ${FNAME} ${channel}"_"${STARTH}"."${STARTM}"."${STARTS}"-"${ENDH}"."${ENDM}"."${ENDS}".dav"
done