实用脚本能批量截断吗?

wen 实用脚本 12

本文目录导读:

实用脚本能批量截断吗?

  1. 批量截断文件名(缩短文件名)
  2. 批量截断文件内容(保留前N行/字符)
  3. 批量截断文本行(每行取前N个字符)
  4. 批量截断CSV/Excel数据(Python实用脚本)
  5. 配合工具的快速方案
  6. 推荐给你的实用脚本组合

可以的!实用脚本完全可以批量截断,截断”可能有几种不同的含义,我分别给你介绍几种常见的批量截断场景和对应的脚本方案:

批量截断文件名(缩短文件名)

如果你有一堆文件需要缩短文件名到指定长度:

Windows (PowerShell):

# 将当前目录下所有.txt文件截断到10个字符
Get-ChildItem *.txt | ForEach-Object {
    $newname = $_.BaseName.Substring(0, [Math]::Min(10, $_.BaseName.Length)) + $_.Extension
    Rename-Item $_.FullName -NewName $newname
}

Linux/Mac (Bash):

# 截断文件名到前10个字符
for f in *.txt; do
    base=$(basename "$f" .txt)
    newname="${base:0:10}.txt"
    mv "$f" "$newname"
done

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

保留前100行:

# Linux
for f in *.log; do
    head -n 100 "$f" > "truncated_$f"
done

保留前1000个字符:

# Linux
for f in *.txt; do
    dd if="$f" of="truncated_$f" bs=1000 count=1 2>/dev/null
done

批量截断文本行(每行取前N个字符)

Python脚本:

import os
def truncate_lines(input_file, output_file, max_chars=80):
    with open(input_file, 'r') as f_in, open(output_file, 'w') as f_out:
        for line in f_in:
            f_out.write(line[:max_chars] + '\n')
# 批量处理所有.txt文件
for filename in os.listdir('.'):
    if filename.endswith('.txt'):
        truncate_lines(filename, f"truncated_{filename}")

批量截断CSV/Excel数据(Python实用脚本)

import pandas as pd
import os
# 批量处理所有csv文件,只保留前100行
for file in os.listdir('.'):
    if file.endswith('.csv'):
        df = pd.read_csv(file)
        df.head(100).to_csv(f"truncated_{file}", index=False)

配合工具的快速方案

使用 Vim 批量截断:

# 批量截断所有txt文件到50行
for f in *.txt; do
    vim -c "normal 51GdG" -c "wq" "$f"
done

使用 sed 批量截断每行:

# 每行只保留前80个字符
sed -i 's/^\(.\{80\}\).*/\1/' *.txt

推荐给你的实用脚本组合

如果你经常需要处理这类任务,可以把这个保存为 batch_truncate.sh

#!/bin/bash
# 批量截断工具 - 多功能版
usage() {
    echo "用法: $0 [选项] <文件模式>"
    echo "  -n N    保留前N行"
    echo "  -c N    每行保留前N个字符"
    echo "  -f N    截断文件名到N个字符"
    exit 1
}
while getopts "n:c:f:" opt; do
    case $opt in
        n) 
            for f in ${@:$OPTIND}; do
                head -n $OPTARG "$f" > "truncated_$f"
            done
            ;;
        c)
            for f in ${@:$OPTIND}; do
                sed -i "s/^\(.\{$OPTARG\}\).*/\1/" "$f"
            done
            ;;
        f)
            for f in ${@:$OPTIND}; do
                base="${f%.*}"
                ext="${f##*.}"
                newname="${base:0:$OPTARG}.$ext"
                mv "$f" "$newname"
            done
            ;;
        *) usage;;
    esac
done

使用示例:

# 保留前100行
./batch_truncate.sh -n 100 *.log
# 每行保留前50个字符
./batch_truncate.sh -c 50 *.txt
# 文件名截断到8个字符
./batch_truncate.sh -f 8 *.jpg

你想做哪种类型的截断?可以告诉我具体需求,我给你定制一个更精准的脚本!

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