本文主要记录一下项目脚本中常常会使用到shell命令。以前处理文件夹和文件我更多选择python,提供了接口很方便。但是最近发现其实这些功能shell命令就能完成,而且更加简洁。更重要的,大多数shell命令是跨平台的,不像python那样还需要安装解释器。因此我尝试将项目中常常需要用到的功能记录下来。
1.获得项目根路径
假设我们的项目路径为root,root下存在scripts文件夹存放我们的所有脚本。有些时候,我们可能会在root下执行脚本,例如./scripts/xxx.sh,也可能会直接在scripts下执行脚本,./xxx.sh。如果我们统一脚本中的一些路径,可以采取先获得项目根路径,再依据根路径设置其他文件。如下:
#!/bin/bash
PROJECT_ROOT=$(cd `dirname $0`/../; pwd)
INCLUDE_DIR=$PROJECT_ROOT/include
SOURCE_DIR=$PROJECT_ROOT/src
ALL_DIRS="$INCLUDE_DIR $SOURCE_DIR"
2.递归获取文件夹下所有路径
find $ALL_DIRS -type d
3.递归获取文件夹下所有文件
find $ALL_DIRS -type f
4.递归获取文件夹下所有文件名
find $ALL_DIRS -type f -exec basename {} \;
5.递归获取文件夹下符合条件后缀的文件
find $ALL_DIRS -type f -name "*.cpp" -o -name "*.hpp"
6.递归获取文件夹下符合条件后缀的文件,及其的行数
find $ALL_DIRS -type f -name "*.cpp" -o -name "*.hpp" | xargs wc -l;
忽略注释行之后:
find $ALL_DIRS -type f -name "*.cpp" -o -name "*.hpp" | xargs cat | grep -v -e ^$ -e ^\s*\/\/.**$ | wc -l
7.递归获取文件夹下符合条件后缀的文件,替换所有文件的符合条件的字符
# ORI_STR="old"
# DST_STR="new"
# find $ALL_DIRS -type f -name "*.cpp" -o -name "*.hpp" -exec sed -i "s/$ORI_STR/$DST_STR/g" {} \;
如果要替换的字符串比较多,可以使用字典
declare -A dic
dic=(["abcd"]="ABCD" ["bcde"]="BCDE")
for key in $(echo ${!dic[*]})
do
find $ALL_DIRS -type f -name "*.cpp" -o -name "*.hpp" -exec sed -i "s/$key/${dic[$key]}/g" {} \;
done