find查找多种文件后缀
find命令最常用的是查找某个文件,如:
find ./ -name"abc.txt"
则会在当前目录及子目录下查找abc.txt文件
更常用的是查找某一类型的文件,如:
find ./ -name"*.txt"
则会在当前目录及子目录下查找所有txt文件,但是如果要查找多种文件类型呢?比如某文件夹下面所有.c文件和.h文件,可以这样做:
find ./ -name"*.[ch]"
这个方法有很大的局限性,只对单个字符结尾的文件有效,因为引号里面的是通配符,所以多个多字符结尾的文件只能用正则表达式来查找:
find ./ -regex".*\.java\|.*\.xml"
上面这条命令会查找当前文件夹下面的所有java文件和xml文件,find默认采用emacs正则,会比较罗嗦,如果采用posix-extended正则会比较简单,如下:
find ./ -regextypeposix-extended -regex ".*\.(java|xml)"
当然,如果不需要查找大量后缀,最简单的方式是使用-o选项,优点是比较好记:
find ./ -name"*.java" -o -name "*.xml"
还有比较低效的方法,查找出所有文件再过滤:
find ./ -type f |egrep "\.(java|xml)$"
给个批量进行git add的操作
find ./ -regex ".*\.h\|.*\.cpp" -exec git add {} \;
find和sed批量替换目录文件中的内容
用下面的命令进行操作
find. -regex ".*\.cpp\|.*\.h" -exec sed -i 's/oldString/newString/g' {} \;
通常会用下面的命令配合进行查找
find. -regex ".*\.cpp\|.*\.h" | xargs grep -n "oldString"
有的时候这个方法不是很好用,可以用另一种方法,用到perl了
find-name 'pom.xml' | xargs perl -pi -e 's|oldString|newString|g'
Ok,还可以抛弃掉find命令
sed-i "s/oldString/newString/g" `grep oldString -rl /path`
还可以用awk
grep"oldString" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i's/oldString/newString/g'
这个里面有个批量替换IP的方法
grep"[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" * -R | awk-F: '{print $1}' | sort | uniq | xargs sed -i's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/172\.0\.0\.1/g'