总结一下,平时常用的linux数据处理命令:
1、生成trainval.txt test.txt 需要用到的随机提取文件名命令:
先随机打乱行:shuf class.txt > class_shuffle.txt
切取前100行:head -n100 class_shuffle.txt > target1.txt
切取剩下行:tail -n+101 class_shuffle.txt > target2.txt
切取中间行1001行到2000行:sed -n '1001,2000p' images.txt >2.txt
2、对一个文件夹下的文件进行文件进行名字提取:
包含扩展名:ls -1 | grep ".jpg$" > /home/2.txt ls | grep ".jpg" > /home/2.txt
包含路径:ls /home/caffe_extract/*.jpg > /home/2.txt
3、将2中提取的包含扩展名的.txt里的扩展名去掉、数据集中xml的标签进行替换,可以写成脚本:
#!/bin/sh
把文件夹下xml文件中的字符串A,换成B:sed -i "s/A/B/g" *.xml
包含特殊符号时,用#:sed -i "s#*##g" *.xml(把*替换掉)
文件数量较大时: find /media/test/1/ -name "*.txt" | xargs sed -i "s/1/2/g"
find /home/Annotations/ -name "*.xml" | xargs -i sed -i 's/[A-Z]/\l&/g' {} 大写替换成小写
4、批量修改文件后缀名:
(1)把.c 改成.h: find ./ -name "*.c" | awk -F "." '{print $2}' | xargs -i -t mv ./{}.c ./{}.h
(2)把.jpg 修改成.txt : rename 's/\.jpg/\.txt/' *
(3)删除后缀名.JPG: rename 's/.JPG//' *
(4)给所有文件添加后缀名: rename 's/$/\.txt/' *
(5)统一在文件名前加前缀: rename 's/^/good/' *
(6)文件名中去掉空格:rename 's/ /_/g' *
5、移动文件夹内大量数据:
首先要要进入文件夹目录dir1 在dir1目录下执行
(1) ls dir1 | xargs -t -I {} mv {} dir2/{}
例如 ls /media/JPEGImages/validation_JPEGImages | xargs -t -I {} mv {} /media/JPEGImages/{}
(2) find source/ -name "*.txt" | xargs -i mv {} target/
find -type f -name "*.jpg" | xargs -i cp {} /home
(3)移动指定数量文件到另一个文件夹
ls |head -n 10000 |xargs -i cp {} /tmp 移动前10000个文件 到/tmp
ls |tail -n 10000 |xargs -i cp {} /tmp 移动后10000个文件 到/tmp
ls indir |head -n10000 | xargs -I file mv file outdir
6、统计字符串AABB出现次数并输出
grep -o ' AABB' dir1/*.xml | wc -l >>1.txt
find /Annotations/ -name "*.xml" |xargs grep -o 'AABB'|wc -l>>1.txt
7、查找字符串AABB在出现在哪个文件中
(1)grep -rn "AABB" /home/Annotations/*.xml >1.txt
-r 是递归查找
-n 是显示行号
-R 查找所有文件包含子目录
-i 忽略大小写
(2)find /home/Annotations/*.xml | xargs grep -ri "water" -l >1.txt
find ./xmltest2/ -name "*.xml" -exec grep -ri "AABB" -l >1.txt {} \;
(3)文件中含有空格比如:335_WIN_20201027_14_49_37_Pro (2).xml
用find -print0和xargs -0来进行移动或删除
find ./ -name "*(2).xml" -print0| xargs -0 -i mv {} ./../
find ./ -name "*(2).xml" -print0|xargs -0 rm -rf
8、在首行添加字符串
假设处理的文本为test.file
在每行的头添加字符,比如"HEAD",命令如下:sed 's/^/HEAD&/g' test.file >1.txt
在每行的行尾添加字符,比如“TAIL”,命令如下:sed 's/$/&TAIL/g' test.file
在文件1.txt首行插入: sed -i "1i #!/bin/sh " 1.txt
在文件1.txt第n行插入(n<=文本行总数): sed -i "ni #!/bin/sh " 1.txt
9、查看文件数量和行数
查看文件行数:wc -l filename
查看文件夹内文件数量:ls
-l |
grep
"^-"
|
wc
-l
查看文件夹内以及子文件夹中总共文件数量:
ls -lR|grep "^-"| wc -l
10、查看目录下文件大小
du -ah --max-depth=1
11、查找文件大小为0的文件并删除:find . -name "*" -type f -size 0c | xargs -n 1 rm -f
12、移动指定数量文件到另一个文件夹
ls -Q img10 | head -500 | xargs -i mv img10/{} img10_01/
13、文件分割
split -l num *.txt prefix
split -l 5050 20221014_all_202209030002-202210100009_5W.txt 20221014_all_202209030002-202210100009_5W