我的某个目录里下(当前目录)有很多文件,有些文件名太长了
由于没学过batch ,来当伸手党了,顺便学习,谢谢!
求一个脚本,在当前目录执行,将目录下所有文件名长度超过10的,取前20位重命名。
可以使用批处理脚本(.bat)来批量截短文件名,具体操作如下:
打开记事本或其他文本编辑器,新建一个批处理脚本(例如:truncate_filenames.bat)。
在批处理脚本中添加以下命令:
@echo off
setlocal enabledelayedexpansion
for %%f in (*) do (
set "filename=%%~nf"
set "extension=%%~xf"
if "!filename!" neq "!filename:~0,10!" (
set "newname=!filename:~0,20!!extension!"
ren "%%f" "!newname!"
)
)
3.保存批处理脚本,并将其放置到需要批量截短文件名的目录下。
4.双击运行批处理脚本,它将在当前目录下批量截短文件名。脚本会将当前目录下所有文件名长度超过10的文件名截短为前20位,并将原始文件名重命名为新文件名。
需要注意的是,该脚本仅适用于当前目录下的文件,如果您需要批量截短子目录下的文件名,可以在脚本中添加递归遍历子目录的命令。例如:
@echo off
setlocal enabledelayedexpansion
for /r %%f in (*) do (
set "filename=%%~nf"
set "extension=%%~xf"
if "!filename!" neq "!filename:~0,10!" (
set "newname=!filename:~0,20!!extension!"
ren "%%f" "!newname!"
)
)
这样,脚本将递归遍历当前目录下的所有子目录,并将文件名长度超过10的文件名截短为前20位。
你可以使用批处理脚本来完成这个任务。下面是一个简单的脚本,可以实现将当前目录下文件名长度超过10的文件名取前20位的功能:
@echo off
for %%f in (*) do (
set "filename=%%~nf"
set "ext=%%~xf"
if not "!filename:~10!" == "" (
set "newname=!filename:~0,20!!ext!"
ren "%%f" "!newname!"
)
)
上述脚本中,for 循环遍历当前目录下的所有文件,set 命令将文件名和文件扩展名分别保存在 filename 和 ext 变量中。接着,使用 if 语句判断文件名是否超过10个字符,如果超过,使用 set 命令将文件名的前20个字符和扩展名重新组合成新的文件名,并使用 ren 命令将文件重命名为新的文件名。
请注意,在运行此脚本之前,建议先备份当前目录中的所有文件,以防意外操作导致文件丢失。另外,由于这个脚本会批量重命名文件,建议谨慎操作,避免出现不必要的错误。
在 Linux 命令行下,可以通过 rename 命令来批量处理文件名称。假设有一组文件,例如 file1.txt、file2.txt,以及其它文件,你可以运行下列命令,把文件名称的长度都截短到 8 个字符:
rename -n 's/^(...)./$1/' *
-n 选项表示不要真正去改变文件名称,而在屏幕上显示出操作效果,这样就可以检查一下改什么将改什么,再根据需要真正操作。若你确认结果正确,可以去掉 -n 选项继续操作:
rename 's/^(...)./$1/' *
@echo off
setlocal enabledelayedexpansion
rem 获取当前目录
set "current_dir=%cd%"
rem 遍历目录下所有文件
for %%f in ("%current_dir%\*.*") do (
set "filename=%%~nxf"
rem 判断文件名长度是否超过10
if "!filename:~10!" neq "" (
rem 获取文件名的前20位
set "new_filename=!filename:~0,20!"
rem 构造新的文件路径
set "new_filepath=%current_dir%\!new_filename!"
set "old_filepath=%current_dir%\!filename!"
rem 重命名文件
ren "!old_filepath!" "!new_filename!"
echo 将文件 !filename! 重命名为 !new_filename!
)
)
首先通过%cd%获取当前目录,然后使用for循环遍历目录下的所有文件。
对于每个文件,使用set命令将文件名保存到filename变量中,然后判断其文件名长度是否超过10。
如果是,则使用字符串截取语法!filename:~0,20!获取文件名的前20位,构造新的文件路径,然后使用ren命令重命名文件。
最后输出重命名的结果。
步骤:
1、首先打开要提取文件名的文件夹,新建一个txt文本文件
2、编辑txt文本,输入以下批处理命令,保存文本文件。
dir . /b >a.txt
提示:这一步如果需要提取固定后缀的文件名,修改*.*为相应的后缀即可
3、更改txt文件的后缀为.bat,将其转换为批处理文件
4、双击执行批处理文件,实现批量提取文件名
可以使用批处理脚本实现将当前目录下文件名长度超过10个字符的文件重命名为前20个字符。
@echo off
setlocal enabledelayedexpansion
for %%f in (*) do (
set "filename=%%~nf"
set "ext=%%~xf"
if "!filename!" EQU "!filename:~0,10!" (
echo Skipping file %%f
) else (
set "newname=!filename:~0,20!!ext!"
ren "%%f" "!newname!"
echo Renamed file %%f to !newname!
)
)
这个脚本首先使用一个for循环遍历当前目录下的所有文件。对于每个文件,它提取文件名和扩展名,然后检查文件名是否超过10个字符。如果文件名长度不超过10个字符,则跳过该文件。否则,它使用set命令将文件名截断为前20个字符,并将新文件名与扩展名组合起来,然后使用ren命令重命名文件。
请注意,此脚本将修改文件名,请确保在运行脚本之前备
可以使用以下批处理脚本实现将当前目录下所有文件名长度超过10的,取前20位重命名的功能:
@echo off
setlocal EnableDelayedExpansion
for %%f in (*) do (
set "filename=%%~nf"
if "!filename!" neq "" (
set "newname=!filename:~0,20!%%~xf"
if "!newname!" neq "%%~nxf" (
ren "%%~f" "!newname!"
echo "%%~f" renamed to "!newname!"
)
)
)
echo All files processed.
pause
可以参考这个进行修改
@echo off
set /p firststr="请输入文件名前缀:"
set /p kuozhan="请输入文件扩展名:"
set a=0
setlocal EnableDelayedExpansion
dir /b .\*.%kuozhan% | find /c /v "" >> .\tmp.txt
set /p c=<.\tmp.txt
del /a /f /q .\tmp.txt
for %%i in (*.%kuozhan%) do (
set /a a+=1
if !a! gtr %c% (goto aa)
echo %firststr%!a!
echo %%i
ren "%%i" "%firststr%!a!.%kuozhan%"
)
:aa
pause
不知道你这个问题是否已经解决, 如果还没有解决的话:跳转到对应驱动器后就可以查看它的当前目录,除此之外,还可以用 cd 驱动器号: 命令进行查看,该命令会输出对应驱动器的当前目录。
Windows系统中,可以使用命令行工具来批量修改文件名。首先,打开命令提示符,然后输入“ren”命令,接着输入要修改的文件名,最后输入新的文件名即可。例如,输入“ren oldname.txt newname.txt”,就可以将文件oldname.txt的文件名修改为newname.txt。
可以使用批处理脚本来实现批量截短文件名的操作。下面是一个简单的批处理脚本,可以实现将当前目录下所有文件名长度超过10的文件,取前20位截短重命名:
@echo off
for %%F in (*) do (
set "FILENAME=%%~nF"
set "EXT=%%~xF"
if "!FILENAME!" neq "!FILENAME:~0,10!" (
set "NEWNAME=!FILENAME:~0,20!!EXT!"
echo Renaming "%%F" to "!NEWNAME!"
ren "%%F" "!NEWNAME!"
)
)
这个脚本会遍历当前目录下的所有文件,对于每一个文件,先判断文件名的长度是否超过10个字符,如果超过了,则截取前20个字符,并加上原有的文件扩展名,用截短后的名字来重命名文件。执行脚本时,打开命令提示符窗口,切换到需要操作的目录,然后运行脚本即可。
需要注意的是,为了避免出现重名的情况,这个脚本只会对文件名长度超过10个字符的文件进行重命名。如果需要对所有文件进行重命名,可以将if语句删除。
原文件名如下:
21001_20170101_340000_1_HK_BCF_201701122132_2060.txt
21001_20170101_340000_1_LY_BCF_201701122132_2059.txt
21002_20170101_340000_1_NBCLCK_BCF_201701122132_2064.txt
21002_20170101_340000_1_NBCLJK_BCF_201701122132_2063.txt
21003_20170101_340000_1_TD_BCF_201701122132_2061.txt
21002_20170101_340000_1_ZY_BCF_201701122132_2062.txt
shell脚本如下,其中tshort=${tfile%BCF*.txt}BCF.txt将BCF后面的都截掉,改为BCF.txt,tshort=${tshort#_}则进一步将前面的210001_截掉(删除与*_*匹配的最小部分,返回剩余部分)。
for tfile in *.txt
do
tshort=${tfile%BCF*.txt}BCF.txt
tshort=${tshort#*_*}
if [ ${tfile} != ${tshort} ]; then
mv ${tfile} ${tshort}
fi
done
执行结果如下:
20170101_340000_1_HK_BCF.txt
20170101_340000_1_LY_BCF.txt
20170101_340000_1_NBCLCK_BCF.txt
20170101_340000_1_NBCLJK_BCF.txt
20170101_340000_1_TD_BCF.txt
20170101_340000_1_ZY_BCF.txt
为了保持文件名的一致性,需要将其中部分文件名中的NBCL去掉,这可以用rename命令完成(将_NBCL改为_),即:
rename _NBCL _ *BCF.txt
rename命令是专用于文件重命名的,上面的例子可以看出,rename既可以给单个文件重命名,也可以给批量文件重命名。
注意:rename命令是带3个参数而不是2个参数,上面第二个参数为空,表示删除第一个参数指定的字符。
执行结果如下:
20170101_340000_1_HK_BCF.txt
20170101_340000_1_LY_BCF.txt
20170101_340000_1_CK_BCF.txt
20170101_340000_1_JK_BCF.txt
20170101_340000_1_TD_BCF.txt
20170101_340000_1_ZY_BCF.txt
========================================
很好的方法吧,注意其中通配符的用法,其实关键就在于参数替换的运用,下面总结一下:
${param:-default} 如果param为空,整个式子的值就等于default
${#param} 整个式子的值为param的长度
${param%word} 从param尾部开始删除与word匹配的最小部分,返回剩余部分
${param%%word} 从param尾部开始删除与word匹配的最长部分,返回剩余部分
${param#word} 从param头部开始删除与word匹配的最小部分,返回剩余部分
${param##word} 从param头部开始删除与word匹配的最长部分,返回剩余部分
所谓最小部分就是第一次匹配,而最长部分就是最后一次匹配,例如:
假定aa=iamlaosongsongdc
则echo ${aa%song*} 显示:iamlaosong
而echo ${aa%%song*} 显示:iamlao
如果不用通配符,echo ${aa%%song} 显示:iamlaosongsongdc,因为没有匹配上。
再补充几个用法
${param:=bar} 检查param是否为空,若不为空,则返回其值;否则将param赋值为bar,然后返回这个值
${param:?bar} 若param为空或不存在,则输出param:bar并异常终止脚本
${param:+bar} param存在且不为空的情况下才返回param,否则返回空(貌似bar在这里没用)
${param:m:n} 从param左起第m个字符开始(0表示第一个),向后取n个字符,如省略n,则取其后所有字符
${param:0-m:n} 从param右起第m个字符开始(0-m相当于负值),向后取n个字符,如省略n,则取其后所有字符
${param:m} 从param左起第m个字符开始(0表示第一个),向后取所有字符