shell,给你一个目录,里面有很多文件,把他们改成 1.txt 2.txt 3.txt ....以此类推、盗墓者是个丑奴儿

本文介绍了一个简单的Shell脚本,用于批量修改文件名。通过判断指定路径的存在性和类型(文件或目录),脚本能够实现对单个文件或整个目录内所有文件的重命名操作。

//盗墓者是个丑奴儿,原

//博主个人网站 :https://daomu.kaige123.com

//打完一波小广告,进入正题

 

#!/bin/sh

#1.txt,2.txt,3.txt....申请修改文件名的变量

i=1;

 

#思路:判断传参的路径是否存在,如果存在,判断路径是目录还是文件。

#是文件直接mv修改文件名。

#是目录循环目录下的文件,一个个mv修改文件名。

if [ -e $1 ];then
        if [ -d $1 ];then
                echo '///start///dir///'
                for file in `ls $1`
                do
                        `mv $1$file $1$i.txt`;
                        i=$((i+1))
                done
        else
                echo 'start!';
                `mv $1 $i.txt`;
        fi
else
        echo 'Error FilePath!'
fi
 

运行结果:

rename目录下原有文件:

 

切root用户运行,在home目录下用户权限不够:

 

执行shell:

 

运行完毕后:

你遇到的问题是: > `wmit` 工具原本生成 `wmc_cli.c` 文件,但现在突然生成为 `wmc_cli.c_`(带下划线后缀)。 这是一个典型的 **WMI Tool(Wireless Management Interface Tool)行为异常问题**,常见于高通/Qualcomm 的无线驱动开发或嵌入式 Linux 环境中。我们来详细分析原因和解决方案。 --- ### 回答问题 #### ❓ 为什么 `wmit` 会把 `wmc_cli.c` 改成生成 `wmc_cli.c_`? > **根本原因:`wmit` 工具在生成文件时检测到目标文件正在被使用、不可、或存在保护机制,为了避免覆盖正在编译的源文件,它自动将输出重命名为 `.c_` 作为临时文件。** 这是 `wmit`(或其配套脚本)的一种 **安全机制** —— 防止破坏正在进行构建(build)的 `.c` 文件。 --- ### ✅ 常见原因分析 | 原因 | 说明 | |------|------| | 🔴 目标文件被锁定或只读 | `wmc_cli.c` 被编辑器、IDE、make 进程占用,或权限不足 | | 🔴 构建系统正在使用该文件 | 编译过程未结束,`gcc` 正在读取 `wmc_cli.c` | | 🔴 输出目录权限不足 | 当前用户无权覆盖已有文件 | | 🔴 `wmit` 脚本逻辑变更 | 某些版本的 `wmit` 或生成脚本默认启用“安全入”模式 | | 🔴 中间文件残留 | 上次生成失败留下 `.c_` 文件,新生成流程误判状态 | --- ### ✅ 典型行为解释 很多代码生成工具(包括 `wmit`)采用如下策略文件: ```bash # 不直接 wmc_cli.c write_to_file("wmc_cli.c_") # 先临时文件 rename("wmc_cli.c_", "wmc_cli.c") # 成功后再重命名 ``` 但如果: - 发现 `wmc_cli.c` 正在被使用(如编译中) - 或 `rename()` 失败(权限/占用) → 就保留为 `wmc_cli.c_`,提示你需要手动处理。 --- ### ✅ 如何解决? #### ✅ 方法一:检查并终止占用进程 使用 `lsof` 查看谁在使用 `wmc_cli.c`: ```bash lsof wmc_cli.c ``` 输出示例: ```bash vim 1234 user txt REG 8,1 123456 /path/to/wmc_cli.c make 5678 user txt REG 8,1 123456 /path/to/wmc_cli.c ``` → 结束相关进程(如 `kill 1234` 或退出 `vim`/`make`)。 --- #### ✅ 方法二:手动重命名 `.c_` 文件 如果确认生成成功但没重命名: ```bash mv wmc_cli.c_ wmc_cli.c ``` 然后检查内容是否完整。 --- #### ✅ 方法三:确保文件 ```bash chmod 644 wmc_cli.c ``` 如果你没有权限,`wmit` 可能拒绝覆盖。 --- #### ✅ 方法四:清理构建环境后重新生成 ```bash make clean # 清除编译中的引用 rm -f wmc_cli.c # 删除旧文件 rm -f wmc_cli.c_ # 删除临时文件 ./run_wmit.sh # 重新运行 wmit 生成脚本 ``` 理想情况下,这次应正常生成 `wmc_cli.c`。 --- #### ✅ 方法五:查看 `wmit` 脚本逻辑 打开调用 `wmit` 的 shell 脚本(例如 `generate_wmi.sh`),查找类似逻辑: ```bash ${WMIT} -o wmc_cli.c_ ... if [ -f wmc_cli.c_ ]; then mv wmc_cli.c_ wmc_cli.c fi ``` 或者: ```bash # 某些版本会加判断:如果原文件存在且 busy,则不覆盖 if pgrep -f "make" > /dev/null; then OUTPUT="wmc_cli.c_" else OUTPUT="wmc_cli.c" fi ``` 📌 修改建议: - 确保构建时不并发运行 `wmit` - 在非构建时段生成 WMI 文件 - 或修改脚本强制覆盖: ```bash mv -f wmc_cli.c_ wmc_cli.c ``` --- ### ✅ 如何预防? | 措施 | 建议 | |------|------| | 🟢 在 `make clean` 后再生成 WMI 文件 | 避免冲突 | | 🟢 使用独立的输出目录 | 如 `gen/wmc_cli.c`,避免与源码混杂 | | 🟢 添加生成脚本锁机制 | 防止重复执行 | | 🟢 日志记录生成结果 | 方便调试 | --- ### 示例:安全的 WMI 生成脚本片段 ```bash #!/bin/bash WMIT=./wmit OUTPUT_C=wmc_cli.c TEMP_C=${OUTPUT_C}_ # 停止并发生成 if [ -f ${TEMP_C}.lock ]; then echo "Another generation in progress!" exit 1 fi touch ${TEMP_C}.lock # 清理旧临时文件 rm -f ${TEMP_C} # 执行 wmit 生成 ${WMIT} -i wmi_events.xml -o ${TEMP_C} if [ $? -ne 0 ]; then echo "wmit failed!" rm -f ${TEMP_C}.lock exit 1 fi # 安全替换主文件 if [ -f ${TEMP_C} ]; then mv -f ${TEMP_C} ${OUTPUT_C} echo "Generated ${OUTPUT_C}" else echo "No output from wmit" rm -f ${TEMP_C}.lock exit 1 fi rm -f ${TEMP_C}.lock ``` --- ### 最终建议 - `wmc_cli.c_` 是一种 **中间状态文件**,表示生成完成但未正式提交。 - 如果你每次都要手动改名,说明你的构建流程有问题。 - 应该让 `wmit` 在干净环境中运行,并自动完成 `mv` 操作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值