首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash脚本中重命名文件

问如何在bash脚本中重命名文件
EN

Stack Overflow用户
提问于 2014-08-14 13:20:03
回答 4查看 546关注 0票数 0

我在/media/user/docs下面有一个文件夹(>=50)集合,具有以下命名约定:

代码语言:javascript
复制
[2001] xxx 1
[2002] yyy
zzz

我想编写一个bash脚本,将这些文件夹重命名为以下格式:

代码语言:javascript
复制
xxx 1 (2001)
yyy (2002)
zzz

如何通过使用重命名或任何其他Linux命令来实现?我的工作环境是Ubuntu14.04。谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-14 13:32:05

使用mv:

代码语言:javascript
复制
$ ls -d [*
[2001] yyy 2    [2002] xxx 1

做:

代码语言:javascript
复制
for i in [*; do
      new=$(echo $i | tr "[|]" "(|)" | awk '{for (i=2;i<=NF;i++) printf $i" "; print $1}');
      mv "$i" "$new"; 
done

$ ls -d *\)
xxx 1 (2002)    yyy 2 (2001)

它将[]由()替换为tr,然后为每个以[开头的文件切换使用awk的列。

希望这能有所帮助

如果是文件,而不是文件夹:

如果你有超过一个空格和分机:

代码语言:javascript
复制
for i in [*.ext; do
      new=$(echo ${i%.*} | tr "[|]" "(|)" | awk '{for (i=2;i<=NF;i++) printf $i" "; print $1}');
      mv "$i" "$new.ext"; 
done

它将将文件名[2002] yyy 1.ext转换为yyy 1 (2002).ext。

票数 1
EN

Stack Overflow用户

发布于 2014-08-14 13:25:17

给定一个具有此内容的文件:

代码语言:javascript
复制
$ cat a
[2001] xxx
[2002] yyy
zzz

这可以通过使用back引用(并转义[和])来代替您想要的方式:

代码语言:javascript
复制
$ sed 's/\[\([0-9]*\)\] \(\w*\)$/\2 (\1)/' a
xxx (2001)
yyy (2002)
zzz

这样您就可以完全以相同的方式使用rename:

代码语言:javascript
复制
rename 's/\[\([0-9]*\)\] \(\w*\)$/\2 (\1)/' *
            ^^^^^^^^^^   ^^^^^^^  ^^^^^^^
               |            |     print them back
        catch numbers      catch words
票数 3
EN

Stack Overflow用户

发布于 2014-08-14 14:36:03

超简单解

使用套餐。

代码语言:javascript
复制
mmv -r '\[*\]\ *' '#2 (#1)'

详细信息

这有点复杂,因为您需要转义方括号,这里是一个简短解释。

请注意,重命名目录需要-r。

在此之前

代码语言:javascript
复制
ls -1 ./
  [2001] xxx
  [2002] yyy
  zzz

之后

代码语言:javascript
复制
ls -1 ./
  xxx (2001)
  yyy (2002)
  zzz
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25309049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档