Bash脚本批量删除文件末尾162行并顺序重命名问题
批量删文件末尾行+顺序重命名的解决方案
先解决tac找不到的问题,搞定删末尾162行
你原来的命令里do后面多了个多余的|,而且tac不是所有环境都自带,换用更通用的方法:
方法1:用awk直接处理(推荐)
for i in RMSF_CA_proA_*; do awk -v lines=162 'NR == 1 {total = NR} END {total = NR} NR <= total - lines' "$i" > tmp && mv tmp "$i" done
这个命令会自动计算每个文件的总行数,只保留前「总行数-162」行,不用倒序操作,兼容性更好。
方法2:用wc+head组合
先计算总行数,再截取掉后面162行,还能加判断避免行数不足的情况:
for i in RMSF_CA_proA_*; do total_lines=$(wc -l < "$i") keep_lines=$((total_lines - 162)) if [ "$keep_lines" -gt 0 ]; then head -n "$keep_lines" "$i" > tmp && mv tmp "$i" else echo "$i 行数不够162,跳过删行" fi done
新增顺序重命名功能
在循环里加个计数器,就能按顺序给文件改名,比如改成RMSF_CA_proA_001这种编号格式:
count=1 for i in RMSF_CA_proA_*; do # 先执行删行操作,这里复用上面的wc+head方法 total_lines=$(wc -l < "$i") keep_lines=$((total_lines - 162)) if [ "$keep_lines" -gt 0 ]; then head -n "$keep_lines" "$i" > tmp && mv tmp "$i" else echo "$i 行数不够162,跳过删行" fi # 生成带序号的新文件名,%03d表示3位补零的序号(如001、002) new_name=$(printf "RMSF_CA_proA_%03d" "$count") # 如果原文件有后缀(比如.txt),想要保留后缀就用下面这行替换上面的new_name # new_name=$(printf "RMSF_CA_proA_%03d.%s" "$count" "${i##*.}") mv "$i" "$new_name" count=$((count + 1)) done
注意事项
- 操作前一定要备份文件,避免误操作导致数据丢失
- 如果文件名包含空格,上面的脚本已经用双引号包裹变量,不用担心出错
内容的提问来源于stack exchange,提问作者Prathit
相关产品推荐
相关产品推荐

