Linux——高效玩转命令行
0.统计(文件|压缩文件)的行数
zcat file.gz | sed -n '$=' #迅速。直接打印出多少行。-n 取消默认的输出,使用安静(silent)模式 '$=' 不知道是什么意思
zcat file.gz | awk ‘END{print NR}’ # 迅速。解压打开文件,输出文件最后一行行号
zcat file.gz | grep -n "" |awk -F : 'END{print $1}' #迅速。解压打开文件,文件每行前标出行号并用冒号连接,以冒号为分隔符输出最后一行的第一列
zcat file.gz | wc -l #统计大文件实在是太慢了
期待高效的方法。。。。。。
PS:
zcat file.gz <=> gzip -dc file.gz #压缩文件不能直接进行统计 ;
参考[0]文中后半部分,利用上边的快速统计文件行数命令,写了两个shell脚本去统计目录下指定后缀的文件行数。
1.快速-批量删除文件或目录
1-1.快速删除大文件夹(注意目录后的结束符‘/’)(对于含有海量文件的目录,不能直接rm -rf删除,这样效率很慢:)
rsync -a --delete blank/ test/ 使用空文件夹 blank/ 覆盖原文件夹 test/
1-2.查找并删除文件
find ./ -type f -name "*.log" -mmin +120 -delete 删除当前目录下120min前的所有.log结尾文件
find ./ -type f -name "*.log"
-mtime +300
-delete
删除当前目录下300天前的所有.log结尾文件
这种方式要比下边语句快2-3倍,并且当目录中文件非常多时不会出现列表过长无法删除的异常。
find ./ -name "*.log" -mmin +120 | xargs rm -f
或
find ./ -name "*.log" -mmin +120 -exec rm {} -f # -exec 表示后面执行命令 "{}" -f表示不需要确认 <=>
find ./ -name "*.log" -mmin +120
-exec rm -f "{}" \; #最后的分号不可少
1-3.
delete.sh:
for i in `ls -d path/shell/shell_pipe/step*qsub` # ls列出匹配上的目录 必须用-d 否则ls会把目录下的文件也都列出来
do
rm -r $i
done
for i in `ls path/*log`
do
rm $i
done
eg:快速删除目标文件中自己的qsub目录中的运行oe文件。
/share/app/msort/bin/msort -k rn5 file | grep 'name'|grep 'qsub'|awk '{print $8}'| while read ID #第八列是以qsub结尾的目录全路径,一个个给到$ID
do
for i in `ls $ID/*\.[eo]*` #匹配filename.e.12345 filename.o.12345 文件
do
#echo $i
rm $i
done
for i in `ls $ID/*\.log` #匹配filename.log 文件
do
#echo $i
rm $i
done
done
参考:
[0]http://www.jb51.net/article/61943.htm
[1]https://blog.csdn.net/ydyang1126/article/details/72841308 https://blog.csdn.net/shangzwz/article/details/10304469