实用脚本能批量截断吗?

wen 实用脚本 10

本文目录导读:

实用脚本能批量截断吗?

  1. 批量截断文件内容(保留前N行/字符)
  2. 批量截断文件名(重命名)
  3. 批量截断数据库表(PostgreSQL/MySQL)
  4. 截断日志文件(保留最新部分)
  5. 批量截断字符串(Python)
  6. 使用建议

可以,批量截断(truncate)通常指对文件内容、字符串或数据库表进行裁剪,根据你的实际需求,这里提供几种常见场景的实用脚本方案:

批量截断文件内容(保留前N行/字符)

Shell脚本(Linux/macOS)

#!/bin/bash
# truncate_files.sh - 批量截断文件,保留前100行
TARGET_DIR="/path/to/files"
MAX_LINES=100
for file in "$TARGET_DIR"/*.txt; do
    if [ -f "$file" ]; then
        echo "截断: $file"
        # 方法1:直接截断(会修改原文件)
        head -n $MAX_LINES "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"
        # 方法2:保留备份
        # head -n $MAX_LINES "$file" > "${file}.truncated" 
    fi
done

按字节/字符截断

for file in *.txt; do
    # 保留每个文件前5000字节
    dd if="$file" of="${file}.truncated" bs=1 count=5000 2>/dev/null
done

批量截断文件名(重命名)

# truncate_filename.py - 批量截断文件名
import os
import glob
# 截断到指定长度(例如保留前15个字符)
MAX_NAME_LEN = 15
EXTENSION = ".txt"
for filepath in glob.glob(f"*{EXTENSION}"):
    basename = os.path.splitext(filepath)[0]
    if len(basename) > MAX_NAME_LEN:
        new_name = basename[:MAX_NAME_LEN] + EXTENSION
        os.rename(filepath, new_name)
        print(f"重命名: {filepath} -> {new_name}")

批量截断数据库表(PostgreSQL/MySQL)

PostgreSQL批量截断所有表

-- 生成截断语句
SELECT 'TRUNCATE TABLE "' || tablename || '" CASCADE;' 
FROM pg_tables 
WHERE schemaname = 'public';
-- 或一次性执行(谨慎!)
DO $$
DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(r.tablename) || ' CASCADE;';
    END LOOP;
END $$;

MySQL批量截断

#!/bin/bash
# truncate_mysql.sh - 批量截断指定数据库的所有表
DB_NAME="your_database"
MYSQL_USER="root"
MYSQL_PASS="password"
mysql -u$MYSQL_USER -p$MYSQL_PASS $DB_NAME -e "
SELECT CONCAT('TRUNCATE TABLE ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = '$DB_NAME';
" | tail -n +2 | mysql -u$MYSQL_USER -p$MYSQL_PASS $DB_NAME

截断日志文件(保留最新部分)

#!/bin/bash
# truncate_logs.sh - 保留日志文件最后1000行
LOG_DIR="/var/log/myapp"
for logfile in "$LOG_DIR"/*.log; do
    if [ -f "$logfile" ]; then
        # 获取文件行数
        lines=$(wc -l < "$logfile")
        if [ "$lines" -gt 1000 ]; then
            # 截断到最后1000行
            tail -n 1000 "$logfile" > "${logfile}.tmp" && mv "${logfile}.tmp" "$logfile"
            echo "已截断: $logfile ($lines -> 1000行)"
        fi
    fi
done

批量截断字符串(Python)

# truncate_strings.py - 处理CSV等文本文件中的长字符串
import pandas as pd
# 读取CSV文件,截断所有字符串列到100字符
df = pd.read_csv('input.csv', dtype=str)
for col in df.columns:
    df[col] = df[col].apply(lambda x: x[:100] if isinstance(x, str) and len(x) > 100 else x)
df.to_csv('truncated.csv', index=False)

使用建议

场景 推荐工具 注意事项
截断文件行数 head/tail 会丢失数据,务必先备份
截断文件名 Python/Perl 注意处理相同前缀的重名
数据库截断 SQL脚本 无法回滚,先锁表或备份
日志管理 logrotate 专业工具更适合生产环境

安全第一:所有截断操作都是不可逆的,强烈建议:

  1. 先对测试数据运行脚本
  2. 添加 --dry-run 参数模拟运行
  3. 在运行前备份数据
  4. 确认正确定义“截断”的统一规则

如果你有更具体的文件类型或截断规则,请补充说明,我可以提供定制化脚本。

抱歉,评论功能暂时关闭!