用于批量重命名文件的Shell脚本

时间:2017-06-21 11:50:45

标签: bash shell file-rename batch-rename

我想通过更改前缀来递归重命名目录路径中的所有文件。

例如

r

XYZMyFile.h
XYZMyFile.m
XYZMyFile1.h
XYZMyFile1.m
XYZMyFile2.h
XYZMyFile2.m

这些文件位于具有多个图层的目录结构下。有人可以帮我处理这个批量任务的shell脚本吗?

4 个答案:

答案 0 :(得分:1)

可能采用不同的方法:

ls *.{h,m} | while read a; do n=ABC$(echo $a | sed -e 's/^XYZ//'); mv $a $n; done

说明

ls *.{h,m} --> Find all files with .h or .m extension
n=ABC --> Add a ABC prefix to the file name
sed -e 's/^XYZ//' --> Removes the XYZ prefix from the file name
mv $a $n --> Performs the rename

答案 1 :(得分:0)

首先设置globstar,然后使用如下所示重命名:

# shopt -s globstar # This will cause '**' to expand to each and everything
# ls -R
.:
nXYZ1.c  nXYZ2.c  nXYZ3.c  subdir  XYZ1.m  XYZ2.m  XYZ3.m
nXYZ1.h  nXYZ2.h  nXYZ3.h  XYZ1.c  XYZ2.c  XYZ3.c
nXYZ1.m  nXYZ2.m  nXYZ3.m  XYZ1.h  XYZ2.h  XYZ3.h

./subdir:
nXYZ1.c  nXYZ1.m  nXYZ2.h  nXYZ3.c  nXYZ3.m  XYZ1.h  XYZ2.c  XYZ2.m  XYZ3.h
nXYZ1.h  nXYZ2.c  nXYZ2.m  nXYZ3.h  XYZ1.c   XYZ1.m  XYZ2.h  XYZ3.c  XYZ3.m
# rename 's/^XYZ(.*.[mh])$/ABC$1/;s/^([^\/]*\/)XYZ(.*.[mh])$/$1ABC$2/' **
# ls -R
.:
ABC1.h  ABC2.m  nXYZ1.c  nXYZ2.c  nXYZ3.c  subdir  XYZ3.c
ABC1.m  ABC3.h  nXYZ1.h  nXYZ2.h  nXYZ3.h  XYZ1.c
ABC2.h  ABC3.m  nXYZ1.m  nXYZ2.m  nXYZ3.m  XYZ2.c

./subdir:
ABC1.h  ABC2.h  ABC3.h  nXYZ1.c  nXYZ1.m  nXYZ2.h  nXYZ3.c  nXYZ3.m  XYZ2.c
ABC1.m  ABC2.m  ABC3.m  nXYZ1.h  nXYZ2.c  nXYZ2.m  nXYZ3.h  XYZ1.c   XYZ3.c
# shopt -u globstar # Unset gobstar

这可能是实现目标的最简单方法。

<子> 注1:我在注意,我并未将nXYZ更改为nABC。如果要更改它们,则简化的rename命令将是

rename 's/XYZ(.*.[mh])$/ABC$1/' **

注2:这个问题没有提及XYZ的多次出现。所以在这方面没有做任何事。

答案 2 :(得分:0)

对于非递归:

rename -v -n 's/^.+(?=MyFile)/what-you-want/' *.{h,m}  

测试

 dir >  ls | cat -n
     1  XYZMyFile1.h
     2  XYZMyFile1.m
     3  XYZMyFile.h
     4  XYZMyFile.m
 dir >  
 dir >  rename -v -n 's/^.+(?=MyFile)/what-you-want/' *.{h,m}
rename(XYZMyFile1.h, what-you-wantMyFile1.h)
rename(XYZMyFile1.m, what-you-wantMyFile1.m)
rename(XYZMyFile.h, what-you-wantMyFile.h)
rename(XYZMyFile.m, what-you-wantMyFile.m)
 dir >  

并且对于递归,请使用find +此命令

renrem

renrem

答案 3 :(得分:0)

Easy findrename(/ usr / bin中的二进制文件,而不是提到的Perl函数)

是的,有一个命令来执行非递归操作。

rename XYZ ABC XYZ*

rename --help

Usage:
 rename [options] expression replacement file...

Options:
 -v, --verbose    explain what is being done
 -s, --symlink    act on symlink target

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see rename(1).

编辑:错过&#34;多层目录&#34;问题的一部分,b / c它有点乱。添加查找。

最容易记住:

find . -type f -name "*.pdf" -exec rename XYZ ABC {} \;

可能更快完成:

find . -type d -not -path "*/\.*" -not -name ".*" -exec rename XYZ ABC {}/*.pdf \;

我不确定如何比一个命令行更简单。