写在前面的话
这个代码功能是通过flownet2提取视频帧的光流信息,代码链接:https://github.com/NVIDIA/flownet2-pytorch,因为该开源工程代码只能指定到 .jpg .png 等视频帧的当前目录,而我们需要提取光流的视频帧在多级目录下,需要进行目录的遍历,所以写了该shell脚本方便多个目录下视频帧的光流提取。
该shell代码包含了读取当前目录所有文件、判断文件名称是否为数字和判断路径是否存在三个功能。
完整代码
代码可以借鉴,注意代码运行的环境和编译器,还要注意shell脚本对空格、换行等比较敏感
#!/bin/bashdst_path="/home/server/project/GroupFormer-main/data/videos/";
cd $dst_path;
path_list1="$(ls)";for p1 in $path_list1;
doif [[ $p1 =~ ^[0-9]+$ ]]; thencd $p1path_list2="$(ls)";for p2 in $path_list2;doif [[ $p2 =~ ^[0-9]+$ ]]; then_dir=$dst_path$p1$"/"$p2if [ -d $_dir ]; thenecho $_dirpython /home/server/project/flownet2-pytorch/main.py --inference \--model FlowNet2 \--save_flow \--save ./output \--inference_dataset ImagesFromMultiFolder \--inference_dataset_root $_dir \--resume /home/server/project/flownet2-pytorch/FlowNet2_checkpoint.pth.tarfifidonecd .. #return the previousfi
done
代码讲解
这段Shell脚本的功能是在指定的路径下进行遍历,并执行一系列操作。
首先,将目标路径存储在变量dst_path
中,并使用cd
命令切换到该路径。然后,通过ls
命令获取目标路径下的文件和目录列表,并将结果存储在变量path_list1
中。
接下来,使用for
循环遍历path_list1
中的每个元素,表示为变量p1
。在每次循环中,首先使用正则表达式判断p1
是否为一个数字。如果是数字,则进入相应的目录。
在每个数字目录中,再次使用ls
命令获取该目录下的文件和目录列表,并将结果存储在变量path_list2
中。
继续使用另一个for
循环遍历path_list2
中的每个元素,表示为变量p2
。同样,使用正则表达式判断p2
是否为一个数字。如果是数字,则构建目录路径_dir
。
然后,通过-d
条件判断选项检查路径_dir
是否为一个存在的目录。如果是存在的目录,则执行相应的操作,这里是调用Python脚本main.py
进行处理。
最后,使用cd ..
命令返回上一级目录,完成当前数字目录的处理。
请确保相关的文件和目录存在,并适当配置Python脚本中的参数。在执行该脚本之前,建议进行备份或谨慎测试,以免不可逆地修改或删除文件。
功能代码
1.判断一个字符串是否为数字:
#!/bin/bashstr="123"# 使用正则表达式进行判断
if [[ $str =~ ^[0-9]+$ ]]; thenecho "The string is a number."
elseecho "The string is not a number."
fi
2.判断一个字符串是否为浮点数:
#!/bin/bashstr="3.14"# 使用正则表达式进行判断
if [[ $str =~ ^[0-9]+(\.[0-9]+)?$ ]]; thenecho "The string is a floating-point number."
elseecho "The string is not a floating-point number."
fi
3.判断一个路径是否存在:
#!/bin/bashpath="/path/to/directory"# 判断路径是否存在
if [ -d "$path" ]; thenecho "The directory exists."
elseecho "The directory does not exist."
fi
4.字符串拼接:
str1="Hello"
str2="World"#四种方法
result=$str1$str2
result="${str1}${str2}" #使用${var}形式的变量引用
str1+=$str2 #使用`+=`运算符:
result=$(printf "%s%s" $str1 $str2) #使用`printf`命令进行格式化输出:
请根据具体情况选择适合的字符串拼接方式。需要注意的是,在拼接字符串时,如果字符串中包含空格或特殊字符,最好将变量用双引号 "
括起来,以避免解析问题。