linux下开发脚本搜索子目录批量更改文件名

Test 目录下有五个子目录:
test1
test2
test3
test4
test5
----------------------------
Test1 目录下的很多文件都是以abc.20100309102340 abc.20100310102332
Test2 目录下的很多文件是以abb.20100309102344 abb.20100310102354
Test3 目录下的很多文件是以acc.20100309102346 acc.20100310102364
Test4 目录下的很多文件是以acd.20100309102343 acd.20100310102354
Test5 目录下的很多文件是以aab.20100309102345 aab.20100310102334
------------------------------
我想问下,怎样做个自动更名的脚本,将这些文件去掉分秒,改成xxx.年月日.txt,-----------------------------------------曾经在单独目录下尝试过mv命令来修改,但好像不支持批量文件的改名
使用rename修改的话,就会丢失一个文件,所以很奇怪,难道是我的命令格式不对?
rename abc.* abc."`date "+%Y%m%d"`".txt abc.*
mv abc.* abc."`date "+%Y%m%d"`".txt <<----单个文件是可以,但批量就会出错。。。。 应该怎样做到批量呢???

前言
本文主要给大家介绍了关于Linux shell用sed批量更改文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
示例

去除特定字符
目标:将 2017-01-01.jpg、2018-01-01.jpg 改为 20170101.jpg、20180101.jpg

方法:将所有 - 替换为空
for file in `ls | grep .jpg`
do
newfile=`echo $file | sed 's/-//g'`
mv $file $newfile
done

这里使用sed进行标准输出的字符串替换,其通用格式如下:
stdout | sed 's/pattern/replace/'

上述示例中,在末尾添加g用于替换所有匹配项,而不仅仅替换第一个匹配项。
中间插入字符
目标:将 book01.txt、paper02.txt 改为 book-01.txt、paper-02.txt
方法:用分组匹配分别获取待插入位置两侧的字符串,再通过反向引用实现替换
for file in `ls | grep .txt`
do
newfile=`echo $file | sed 's/\([a-z]\+\)\([0-9]\+\)/\1-\2/'`
mv $file $newfile
done

分析

上述示例首先通过 ls 和 grep 命令得到待改名的文件列表,然后用 sed 命令进行字符串的替换,最后再使用 mv 命令来完成文件名的更改。
获取待改名文件列表的方法有很多,可以通过 find 命令,也可以直接给出字符串,我们将在下文中提到。
注意 for 循环后面的 ls | grep .txt,这条命令用两个反单引号括了起来,与 $(ls | grep .txt) 的作用相同,被包围的字符串会被当作命令执行,然后返回字符串结果。
文件名包含空格的解决方法
我们可以直接将文件列表写到 for 循环中,而不是通过命令来得到,例如:
for file in "file1 file2 file3"
do
...
done

可以看到 for 循环是通过空格来分割字符串,因此如果待更改的文件名中包含空格的话,就会被拆分成多个文件名,从而出错。
要解决这个问题,我们可以将 IFS(内部字段分隔符)设置为换行符 \n,这样一来,for 循环就会按行来获取变量的值,确保每次获取的确实是一个完整的文件名。
设置 IFS 变量的命令需要放在 for 循环之前:
IFS=$'\n'
for file in `ls`
do
...
done

也可以直接使用 while read 命令一次读取一行到变量 file 中:
ls | grep "*.txt" | while read file
do
...
done

使用 find 获取文件列表
之前的示例中,我们是通过 ls 命令来获取文件列表。该命令只能获取某个目录的文件,而且没法进行多种条件的筛选。
而一说到文件的查找,不得不提到功能强大的 find 命令。该命令可以在多个层次的目录中查找文件,并能够设定诸如创建时间、文件大小、所有者等多种条件,查找起文件来特别方便灵活。
用 find 命令来获取文件列表,再用 sed 命令配合正则表达式来修改文件名,这两个命令的结合几乎能完成所有常见的批量改名任务。
例如,将所有大于1M,且后缀为txt或jpg的文件,由形如 book_20170101.txt、image_20170101.jpg 的文件改名为 20170101-book.txt、20170101-image.jpg,代码如下:
for file in `find . -size +1M -name "*_*.txt" -o -name "*_*.jpg"`
do
newfile=`echo $file | sed 's/\([a-z]\+\)_\([0-9]\+\)./\2-\1./'`
mv $file $newfile
done
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-01-05
你这么写是不行的,date生成的日期都一样了,文件名重复
可以通过写脚本自动一个个改名,但是去掉分秒之后,同目录下同日期文件,后改的会把前面的冲掉,也是丢文件
第2个回答  2013-04-08
如果你的文件名就是这样的 话 下面的小脚本可以完成 #!/bin/shcd /Test/Test1for files in `ls *`do mv $files `echo "${files:0:11}.txt"` done 这是单个文件夹的 要多个一次做完自己去弄。 可以复制5次这个段代码 改改就好。或者 把5个文件夹目录做成一个数组 拿去遍历。
第3个回答  2018-01-14
cp命令将文件复制到目录文件夹。
如果需要复制一个文件到多个文件夹下,可以使用多条cp语句,或者使用shell脚本。
第4个回答  2013-04-07
格式固定的话 去掉后面6个嘛~~~在加‘.txt’~~~~
用os.poen(‘ls’)获取各个目录下的文件名,用a表示文件名,a[0:12]获取到你要的字符串,在加'.txt',用b表示你要该的文件名,每读取一个重命名一个嘛~~~

脚本Linux下批量重命名脚本实现快速改名批量重命名linux
mv $file `echo $file | sed ‘s\/$1\/$2\/g’`done 上面的脚本接受三个参数:脚本名称,被替换字符串,替换字符串。这个脚本可以实现把当前目录下所有以被替换字符串结束的文件,批量用替换字符串进行替换。使用脚本前,需要用Linux命令chmod +x 将脚本改为可执行文件。然后,在当前目录...

linux下开发脚本搜索子目录批量更改文件名
用 find 命令来获取文件列表,再用 sed 命令配合正则表达式来修改文件名,这两个命令的结合几乎能完成所有常见的批量改名任务。例如,将所有大于1M,且后缀为txt或jpg的文件,由形如 book_20170101.txt、image_20170101.jpg 的文件改名为 20170101-book.txt、20170101-image.jpg,代码如下:for file in ...

linux下开发脚本搜索子目录批量更改文件名
如果你的文件名就是这样的 话 下面的小脚本可以完成 #!\/bin\/shcd \/Test\/Test1for files in `ls *`do mv $files `echo "${files:0:11}.txt"` done 这是单个文件夹的 要多个一次做完自己去弄。 可以复制5次这个段代码 改改就好。或者 把5个文件夹目录做成一个数组 拿去遍历。

linux重命名文件夹的命令linux重命名文件夹
linux打开命令窗口,可以使用命令cd~切换到用户主目录,然后使用命令mkdir文件夹名称即可。Linux下硬盘分区命名?在Linux下对IDE的设备是以hd命名的,一般主板上有两个IDE接口,一共可以安装四个IDE设备。主IDE上的主从两个设备分别为hda和hdb,第二个IDE口上的两个设备分别为hdc和hdd。一般硬盘安装在主I...

Linux下批量重命名的技巧批量重命名linux
`mv [old-name] [new-name]`其中,[old-name] 是我们想要重命名的旧文件名,[new-name] 是要替换的新文件名,例如,我们想要将一个目录中的所有.txt文件的名字全都改为.bat,可以使用以下命令:`mv *.txt *.bat`另外,在Linux系统中还可以使用rename命令来批量更改文件的名字,它的用法比mv...

linux给文件批量改名字
do target=$(echo $file|awk -F_mig '{print $1}')cp $file $target done 执行上面这个脚本,可以把当前目录下以_mig结尾的文件复制一个(去掉_mig)。如果你不要原来的文件,把cp改为mv。这个脚本有个问题,就是说源文件名中只能有一个_mig,比如如果有134_mig_13_mig这样的文件,那么结果...

linux怎么批量修改文件名称
可以用脚本实现批量文件名称修改,以perl脚本为例:注释:1. # touch rename.perl \/\/创建一个文件:rename.perl , 内容如下。2. # chmod +x rename.perl 3. # cp rename.perl \/bin\/ 4. # rename.perl 's\/gongxu\/leibie\/g' * \/\/将目录中所有文件名中的 gongxu 替...

linux批量重命名文件夹的子文件夹里的文件
1、在Picture目录创建a.sh !\/bin\/sh for file in `find . -type f -name "*.jpg"`;do dirname=`dirname $file`newfile=`echo $file | sed 's,\\\/,_,g'|sed 's,\\._,,g'`echo $file $dirname\/$newfile;mv $file $dirname\/$newfile;done 2、执行结果 .\/1\/1\/c.jpg .\/1\/1...

windows与linux下 如何批量更改文件名
「1」新建文件夹,起名为「rename_by_source」,用来放置「改名前的文件」、「shell脚本文件」、「文件名对应文件」,以及保存「改名后的文件」。你在自己电脑上操作时,也建议你把下载下来的需要改名的文件放到一个单独的文件夹里,这样容易查看一些。「2」我新建的「rename_by_source」文件夹中,根据...

linux 下用什么命令批量替换一个目录下的字符串
if [ ! "$do" = "" ]; then newname=`echo $line | sed 's\/'$2'\/'$3'\/g'`echo "rename $line to $newname ..."mv $1\/$line $1\/$newname fi done --- 将以上保存为 rename文件,然后运行 chmod +x rename 使rename可运行 然后按照如下格式执行rename 假设rename在当前路径 ...

相似回答