一周学的shell;一周半学的ros;然后这个人给了一个实战和一个开机自启动的任务;头发都掉光了~~
有一个文件夹;里面有一堆.png图片和.jpeg;怎么把他们分开;分别存放在两个文件夹里
代码如下
代码1.0
#! /bin/bash
find . -name ;*.png; | xargs mv -t *demoPng/
find . -name ;*.jpeg; | xargs mv -t *demoJpeg/
代码2.0
#! /bin/bash
cp demo/*.jpeg -a demo/*png demoJpeg
cp demo/*.jpg demoJpg
sudo chmod ;x ./movefile.sh #给movefile权限
其实这个不算难;看了看C站上的一些博客;可以很轻松解决。
shell脚本之find
是实时查找工具;通过遍历指定路径下的文件完成文件查找 工作方式;沿着文件层次结构向下遍历;匹配符合条件的文件;执行响应的操作 find [options] ... [查找条件] [处理动作] 查找路径;指定具体的目标路径;默认当前目录 查找条件;指定的查找标准;可以是文件名;大小;类型;权限等;默认为找出指定路径下的所有文件
根据文件名查找;
-name;文件名称;;支持通配符查找-iname;文件名称;;不区分文件名大小写
# 匹配/home/dou目录下所有以.txt为结尾的文件
find /home/dou -name ;*.txt; -print
根据属主;属组查找
-user USERNAME;查找属主为指定用户的文件-group GROUPNAME;查找属组为指定用户的文件-uid USERID;查找属主为指定uid号的文件-gid GroupID;查找属组为指定GID号的文件-nouser;查找没有属主的文件-nogroup;查找没有属组的文件
find . -type f -user doudou -print
# 打印出当前目录下doudou拥有的所有文件
根据文件类型查找
-type TYPEf;普通文件d;目录文件l;符号链接文件s;套接字文件b;块设备文件c;符号设备文件p;管道文件
# 匹配当前目录下所有的目录文件
find . -type d -print
组合条件
与;-a
或;-o
非;-not;!
#匹配包含这两种文件类型的文件
find .(-name ;*.txt; -o ;*pdf;) -print
根据文件大小进行查找
-size[;,-]num单位;常用单位有;K,M,Gnum单位;显示的是大于num-1;小于等于num这个区间内的值-num单位;显示的是大于0,小于num-1区间内的值;num单位;大于num至无穷大区间内的所有取值
# 匹配当前目录下大于2k的文件
find . -type f -size ;2k
根据文件时间进行查找
访问时间;-atime;;用户最近一次访问文件的时间修改时间;-mtime;;文件内容最后一次被修改的时间变换时间;-ctime;;文件元数据;例如权限和所有权;最后一次改变的时间
# 匹配打印最近7天内访问的所有文件
find . -type f -atime -7 -print
-amin ;访问时间-分钟 -mmin ;修改时间-分钟 -cmin ;变化时间-分钟 根据目录的深度进行查找 -mindepth,-maxdepth选项来限制find命令遍历的目录深度
#列出当前目录下的所有以f开头的文件;即使有子目录;也不会被打印和遍历
find . -maxdepth 1 -name ;f*; -print
处理动作
-print;默认处理动作;显示至屏幕
-ls;类似于对查找到的文件执行“ls -l”命令
-delete;删除查找到的文件
-fls /PATH/TO/SOMEFILE;查找到的所有文件的长格式信息保存至指定文件中
shell脚本之xargs
xargs是给命令传递参数的一个过滤器;也是组合多个命令的一个工具 xargs可以将管道或标准输入数据转换成命令行参数;也能够从文件的输出中读取数据 xargs也可以将单行或者多行文本输入转为其他格式;多行变单行;单行变多行; xargs的默认命令是echo;这意味着通过管道传递给xargs的输入将会包含换行和空白;不过通过xargs的处理;换行和空白将被空格取代 格式; somecommand | xargs -item command -a file 从文件中读入作为sdtin -e flag ;注意有的时候可能会是-E;flag必须是一个以空格分隔的标志;当xargs分析到含有flag这个标志的时候就停止。 -p 当每次执行一个argument的时候询问一次用户。 -n num 后面加次数;表示命令在执行的时候一次用的argument的个数;默认是用所有的。 -t 表示先打印命令;然后再执行。 -i 或者是-I;这得看linux支持了;将xargs的每项名称;一般是一行一行赋值给 {};可以用 {} 代替。 -r no-run-if-empty 当xargs的输入为空的时候则停止xargs;不用再去执行了。 -s num 命令行的最大字符数;指的是 xargs 后面那个命令的最大命令行字符数。 -L num 从标准输入一次读取 num 行送给 command 命令。 -l 同 -L。 -d delim 分隔符;默认的xargs分隔符是回车;argument的分隔符是空格;这里修改的是xargs的分隔符。 -x exit的意思;主要是配合-s使用。。 -P 修改最大的进程数;默认是1;为0时候为as many as it can ;这个例子我没有想到;应该平时都用不到的吧。 xargs cat命令参数
cat main.c | xargs //没加命令;默认为echo
xargs -i命令参数
ls *.c | xargs -i tar -zcvf 2.tgz {}
xargs sh -c命令参数
cat file.txt | xargs -i sh -c ‘command {} | command2 {} && command3 {}‘
shell脚本之mv
shell 的 mv 命令为移动;moving;的意思;实际可分为文件间的移动;文件到目录的移动;目录到目录的移动。
格式; mv [选项] 源文件或目录 目标文件或目录 命令功能; 1.视mv命令中第二个参数类型的不同(是目标文件还是目标目录);mv命令将文件重命名或将其移至一个新的目录中。 2.当第二个参数类型是文件时;mv命令完成文件重命名;此时;源文件只能有一个(也可以是源目录名);它将所给的源文件或目录重命名为给定的目标文件名。 3.当第二个参数是已存在的目录名称时;源文件或目录参数可以有多个;mv命令将各参数指定的源文件均移至目标目录中。 4.在跨文件系统移动文件时;mv先拷贝;再将原有文件删除;而链至该文件的链接也将丢失。 参数; -b ;若需覆盖文件;则覆盖前先行备份。 -f ;force 强制的意思;如果目标文件已经存在;不会询问而直接覆盖; -i ;若目标文件 (destination) 已经存在时;就会询问是否覆盖; -u ;若目标文件已经存在;且 source 比较新;才会更新(update) -t ; --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY;即指定mv的目标目录;该选项适用于移动多个源文件到一个目录的情况;此时目标目录在前;源文件在后。
大概是因为每次运行ros结点时都要打开好几个终端;所以下意识的;就想到了打开多个终端执行;可惜的是;这一版不仅不能开机自启动;就连最基本的运行都很难做到。而且;这个人还指出了这些脚本名字都很难听;于是开始第二版;
FYT2023.service
[Unit]
Description=...
[Service]
#寻找ros包
Environment=LD_LIBRARY_PATH=/opt/ros/noetic/share/cv_bridge:/opt/ros/noetic/share/image_transport:/opt/ros/noetic/share/fyt_msg:/opt/ros/noetic/share/roscpp:/opt/ros/noetic/share/sensor_msgs:/opt/ros/noetic/share/std_mags
#执行的目标脚本
ExecStart=/bin/FYT2023.sh
#异常中止后是否重启的选项;一直重启
Restart=always
Type=simple
#重启间隔;1s
RestartSec=1
#重启次数限制;无限制
StartLimitInterval=0
[Install]
WantedBy = multi-user.target
openrostest.sh
#!/bin/bash
shdir=$(pwd)/FYT2023.sh
shdir1=$(pwd)/openroscore.sh
shdir2=$(pwd)/openconfig.sh
shdir3=$(pwd)/openimg_catcher.sh
shdir4=$(pwd)/opentest_img_catcher.sh
shdir_tls=$(pwd)
echo ;#!/bin/bash; > $shdir1
echo ;cd ../; >> $shdir1
echo ;source devel/setup.bash; >> $shdir1
echo ;roscore; >> $shdir1
echo ;#!/bin/bash; > $shdir2
echo ;cd ../; >> $shdir2
echo ;source devel/setup.bash; >> $shdir2
echo ;rosrun config node; >> $shdir2
echo ;#!/bin/bash; > $shdir3
echo ;cd ../; >> $shdir3
echo ;source devel/setup.bash; >> $shdir3
echo ;rosrun img_catcher node; >> $shdir3
echo ;#!/bin/bash; > $shdir4
echo ;cd ../; >> $shdir4
echo ;source devel/setup.bash; >> $shdir4
echo ;rosrun test_img_catcher node; >> $shdir4
echo ;#!/bin/bash; > $shdir
#echo ;cd ../; >> $shdir
#echo ;catkin_make --pkg fyt_msg; >> $shdir
#echo ;catkin_make; >> $shdir
#echo ;sleep 8s; >> $shdir
#echo ;cd Tools; >> $shdir
echo ;{; >> $shdir
echo ; gnome-terminal -- bash -c ;;$shdir_tls/openroscore.sh;exec bash;;; >> $shdir
echo ;}&; >> $shdir
echo ;sleep 1s; >> $shdir
echo ;{; >> $shdir
echo ; gnome-terminal -- bash -c ;;$shdir_tls/openconfig.sh;exec bash;;; >> $shdir
echo ;}&; >> $shdir
echo ;sleep 1s; >> $shdir
echo ;{; >> $shdir
echo ; gnome-terminal -- bash -c ;;$shdir_tls/openimg_catcher.sh;exec bash;;; >> $shdir
echo ;}&; >> $shdir
echo ;sleep 1s; >> $shdir
echo ;{; >> $shdir
echo ; gnome-terminal -- bash -c ;;$shdir_tls/opentest_img_catcher.sh;exec bash;;; >> $shdir
echo ;}; >> $shdir
echo ;cd $(pwd); >> $shdir
echo ;$(pwd)/FYT2023; >> $shdir
sudo chmod ;x $(pwd)/openroscore.sh
sudo chmod ;x $(pwd)/openconfig.sh
sudo chmod ;x $(pwd)/openimg_catcher.sh
sudo chmod ;x $(pwd)/opentest_img_catcher.sh
sudo cp ./FYT2023.service /etc/systemd/system/ #将服务文件FYT2021.service加入到系统服务文件夹中
sudo cp $shdir /bin/ #将FYT2021.sh复制到 /bin 文件夹中
sudo chmod ;x /bin/FYT2023.sh #给bin中的FYT2021.sh赋予可执行权限
sudo chmod ;x $(pwd)/FYT2023.sh #给bin中的FYT2021.sh赋予可执行权限
sudo systemctl daemon-reload #刷新系统服务列表
sudo systemctl enable FYT2023.service #启动系统服务
这一版又加了删除部署的脚本;基本可以部署成功;只是很奇怪;开机之后执行【rosnode list】查看运行结点的时候;显示链接不上master。想不出来;发给组长。
FYT2023.service
[Unit]
Description=...
[Service]
#寻找OpenVINO中的OpenCV包
Environment=LD_LIBRARY_PATH=/opt/ros/noetic/share/cv_bridge:/opt/ros/noetic/share/image_transport:/opt/ros/noetic/share/fyt_msg:/opt/ros/noetic/share/roscpp:/opt/ros/noetic/share/sensor_msgs:/opt/ros/noetic/share/std_mags
#执行的目标脚本
ExecStart=/bin/FYT2023.sh
#异常中止后是否重启的选项;一直重启
Restart=always
Type=simple
#重启间隔;1s
RestartSec=1
#重启次数限制;无限制
StartLimitInterval=0
[Install]
WantedBy = multi-user.target
Deploy.sh
#!/bin/bash
shdir=$(pwd)/FYT2023.sh
shdir_tls=$(pwd)
echo ;#!/bin/bash; > $shdir
echo ;cd $shdir_tls/../; >> $shdir
echo ;source devel/setup.bash; >> $shdir
echo ;roscore &; >> $shdir
echo ;sleep 8s; >> $shdir
echo ;rosrun config node &; >> $shdir
echo ;rosrun img_catcher node &; >> $shdir
echo ;rosrun test_img_catcher node &; >> $shdir
echo ;cd $(pwd); >> $shdir
echo ;$(pwd)/FYT2023; >> $shdir
sudo cp ./FYT2023.service /etc/systemd/system/ #将服务文件FYT2023.service加入到系统服务文件夹中
sudo cp $shdir /bin/ #将FYT2023.sh复制到 /bin 文件夹中
sudo chmod ;x /bin/FYT2023.sh #给bin中的FYT2023.sh赋予可执行权限
sudo systemctl daemon-reload #刷新系统服务列表
sudo systemctl enable FYT2023.service #启动系统服务
sudo systemctl start FYT2023.service #启动系统服务
Undelpoy.sh
#!/bin/sh
sudo systemctl disable FYT2023.service
sudo rm /etc/systemd/system/FYT2023.service
sudo rm /bin/FYT2023.sh
组长想不出来;摆烂~ 但还是有一个奇怪的解决方案;就是第三版
Deploy.sh
#!/bin/bash
shdir=$(pwd)/FYT2023.sh
shdir_tls=$(pwd)
echo ;#!/bin/bash; > $shdir
echo ;cd $shdir_tls/../; >> $shdir
echo ;source devel/setup.bash; >> $shdir
echo ;roscore &; >> $shdir
echo ;sleep 8s; >> $shdir
echo ;rosrun config node &; >> $shdir
echo ;rosrun img_catcher node &; >> $shdir
echo ;rosrun test_img_catcher node &; >> $shdir
echo ;sleep 500000000s; >> $shdir
sudo cp ./FYT2023.service /etc/systemd/system/ #将服务文件FYT2023.service加入到系统服务文件夹中
sudo cp $shdir /bin/ #将FYT2023.sh复制到 /bin 文件夹中
sudo chmod ;x /bin/FYT2023.sh #给bin中的FYT2023.sh赋予可执行权限
sudo systemctl daemon-reload #刷新系统服务列表
sudo systemctl enable FYT2023.service #启动系统服务
sudo systemctl start FYT2023.service #启动系统服务
Knode.sh
#!/bin/sh
rosnode list | xargs rosnode kill
好不容易搞完了;组长说这一版不稳定;需要用ros的launch来启动多个结点;好吧我不会;但最后组长搞出来了;如下
组长的博客
Deploy.sh
#!/bin/bash
shdir=$(pwd)/FYT2023.sh
shdir_tls=$(pwd)
# 生成 FYT2023.sh 脚本
echo ;#!/bin/bash; > $shdir
echo ;cd $shdir_tls/../; >> $shdir
echo ;export ROS_HOME=;pwd;; >> $shdir
echo ;source devel/setup.sh; >> $shdir
echo ;roslaunch start.launch; >> $shdir
#将服务文件FYT2023.service加入到系统服务文件夹中
sudo cp ./FYT2023.service /etc/systemd/system/
#将FYT2023.sh复制到 /bin 文件夹中
sudo cp $shdir /bin/
#给bin中的FYT2023.sh赋予可执行权限
sudo chmod ;x /bin/FYT2023.sh
#给当前目录中的FYT2023.sh赋予可执行权限
sudo chmod ;x $(pwd)/FYT2023.sh
#刷新系统服务列表
sudo systemctl daemon-reload
#启动系统服务
sudo systemctl enable FYT2023.service
部署
cd Tools
sudo chmod ;x Deploy.sh
sudo ./Deploy.sh
取消部署
sudo ./Undeploy.sh
另外;这些脚本文件都在Tools文件夹下面;但start.launch文件却在Tools文件夹外面
start.launch
<launch>
<node pkg=;config; type =;node; name=;config; respawn=;true;/>
<node pkg=;img_catcher; type =;node; name=;img_catcher; respawn=;true;/>
<node pkg=;test_img_catcher; type =;node; name=;test_img_catcher; respawn=;true;/>
</launch>