我知道这已被多次询问,我对bash很糟糕,我不理解它的正则表达式格式。想我会请求帮助..
我有一个安全摄像头,它以这种格式将文件写入文件夹:
MDalarm_20170320_084514.mkv
所以它去了 - MDalarm_yearmonthday_hourminutesecond.mkv
我想通过执行以下操作来创建一个运行脚本来清理它的cronjob:
将文件放入文件夹中,每年/每月/每天,然后将文件重命名为时间即:08_26_15.mkv,即使是082615.mkv,如果太麻烦也没问题。
所以在MDalarm_20170320_084514.mkv的例子中
它应该产生
/2017/03/20/08_45_14.mkv
或类似。
文件将在它们到来时放在根文件夹中,脚本将每天在文件夹上运行一次/两次以进行清理。
我在php / js / etc中使用正则表达式是不错的...但是bash one我完全不理解这么做。我真诚地感谢你的帮助。
干杯!
答案 0 :(得分:1)
使用它来制作所需的文件名
$echo MDalarm_20170320_084514.mkv | sed -E "s/^MDalarm_[[:digit:]]{8}_//"
084514.mkv 这是为了制作所需的文件夹名称
$echo MDalarm_20170320_084514.mkv | sed -E "s/^MDalarm_([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2})_.*$/\/\1\/\2\/\3/"
/ 2017/3月20日 在shell命令中使用它们来创建文件夹(如果需要)和复制/重命名/移动文件。
答案 1 :(得分:0)
这就是我最终得到的结果,感谢Yunnosch的正则表达式。
#!/bin/bash
if [[ `ls | grep -c mkv` == 0 ]]
then
echo "NO MKV FILES"
else
for f in *.mkv; do
name=`echo "$f"| sed -E "s/^MDalarm_[[:digit:]]{8}_([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})(.*)$/\1h-\2m-\3s\4/"`
dir=`echo "$f" | sed -E "s/^MDalarm_([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2})_.*$/\1\/\2\/\3/"`
mkdir -p "$dir"
mv "$f" "$name"
mv "$name" "$dir"
done
fi
有人写了正则表达式后,我发现了格式,不同但相似。