本文目录导读:

可以,批量截断(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 |
专业工具更适合生产环境 |
安全第一:所有截断操作都是不可逆的,强烈建议:
- 先对测试数据运行脚本
- 添加
--dry-run参数模拟运行 - 在运行前备份数据
- 确认正确定义“截断”的统一规则
如果你有更具体的文件类型或截断规则,请补充说明,我可以提供定制化脚本。