实用shell命令
1 minute read
0x0 预备知识
- 之所以能用到xargs这个命令,是由于很多命令不支持
|
管道来传递参数 - ack中:
-r
代表在当前目录的子目录中递归查找-l
代表列出符合匹配内容的文件名-i
代表在正则查找时忽略大小写
- for用法:
for each in $(command1);do command2;done
- find中:
- 正则查找文件名时查找的文件名是包含完整路径的,也即正则表达式要匹配完整路径
- macOS下的正则查找文件名和普通linux下的正则查找文件名用法不同
- macOS中正则查找文件名用法为
find -E . -regex "正则"
- 普通linux中正则查找文件名用法为
find . -regextype posix-extended -regex "正则"
- macOS中正则查找文件名用法为
- find查找时不想显示Permission denied的信息可这样
find ... 2>&1 | grep -v "Permission denied"
- find正则查找文件名时忽略大小写用法为:将
-regex
替换成-iregex
2>&1
中:- 0,1,2分别代表标准输入,标准输出,标准错误
>&1
的写法是为了区别>1
这个重定向到文件名为1的文件,>&1
表示重定向到标准输出- find命令查找文件名时会在终端中显示标准输出和标准错误的信息,也即
find ... == find ... 2>&1
- find命令遇到没有权限的文件会显示权限不足,显示权限不足的信息是标准错误
2>/dev/null
的功能是将标准错误重定向到/dev/nullpython3 xx.py > xx.log 2>&1
中python3 xx.py > xx.log
表示默认的”1”(标准输出)的内容重定向到xx.2>&1表示标准错误输出重定向到标准输出,但是由于标准输出已经有个规则(重定向到xx.log),所以有了2>&1的效果是标准错误也会重定向到xx.log如果一个任务运行时间比较久可这样运行:setsid python3 xx.py > xx.log 2>&1
这样表示在后台运行,且将运行中的标准输出与标准错误记录到xx.log,这样方便定位进度和异常
grep -v
中-v
表示查找不匹配的
0x1 Items
1.查找当前目录下包括子目录内所有的包含’def’字符串的python文件,并删除这些文件
find . -name "*.py" | xargx ack -ri 'def' | xargs rm
或者
for file in $(find . -name "*.py");do ack -il 'def' $file && rm $file;done
或者
for file in $(find . -name "*.py" | xargs ack -li 'def');do rm $file;done
或者
for file in $(find . -name "*.py");do ack -il 'def' $file;doen | xargs rm
2.查找当前目录下包括子目录内所有的临时文件(.swp,.swm,.swn,.swo等,但不包括.swf),并删除这些文件
macOS下:
find -E . -regex ".+\.sw[^f]$" 2>/dev/null | xargs rm
或
find -E . -regex ".+\.sw[^f]$" | grep -v "Permission denied" | xargs rm
或
find -E . -regex ".+\.sw[^f]$" 2>&1 | grep -v "Permission denied" | xargs rm
普通linux下:
find . -regextype posix-extended -regex ".+\.sw[^f]$" | grep -v "Permission denied" | xargs rm
3.将godseyedb数据库中的targets表名中的所有可以匹配’.*scaned$’正则的列名所在的列的值全部修改为’0’
for colname in $(mysql -uroot -proot -e "select column_name from information_schema.columns where table_name='targets' and column_name regexp '.*scaned$'" | ack '\S+scaned$');do mysql -uroot -proot -e "use godseyedb;update targets set $colname='0'";done
或者
for colname in $(mysql -uroot -proot -e "use godseyedb;desc targets" | ack -o '\S+scaned(?=\s)');do mysql -uroot -proot -e "use godseyedb;update targets set $colname='0'";done