【问题标题】:Bash script to rename a heap of folders重命名文件夹堆的 Bash 脚本
【发布时间】:2016-04-30 14:55:00
【问题描述】:

我有一个看起来有点像这样的目录:

drw-r--r-- 1 root   root     0 Jan 24 17:26 -=1=-directoryname
drw-r--r-- 1 root   root     0 Jan 24 17:26 -=2=-directoryname
drw-r--r-- 1 root   root     0 Jan 24 17:26 -=3=-directoryname
drw-r--r-- 1 root   root     0 Jan 24 17:26 -=4=-directoryname
drw-r--r-- 1 root   root     0 Jan 24 17:26 -=5=-directoryname

我正在尝试编写一个脚本来更改这些文件夹 -=1=- Folder#1 去掉“-=1=-”部分,可惜我没有运气。

谁能帮我找到解决办法?

到目前为止,我下面的脚本失败了。

#!/bin/bash
for i in {1..250}
do
        rename "-=$i=-" ""*
        i=i+1
done

我用的是 1..250 因为有 250 个文件夹。

【问题讨论】:

  • rename 命令是基于 Perl 还是更简单的 C 程序?
  • 更新问题,去掉开头部分后目录名不是数字标识的。我有重命名的珍珠版。
  • 现在你遇到了不同的问题;目录名称部分是否始终相同?您应该显示-=1=-directoryname 和-=2=-nameofdirectory 和-=3=-directory 和-=4=-name 或其他类似的差异,以便更清楚地处理您正在处理的内容。如果您有 Perl rename(Perl 中没有“a”),那么我的答案可以修改;例如,您只需将 glob 更改为 -=*=-*。如果没有空格,请从s/// 命令正则表达式中删除空格。等等。

标签: linux bash shell rename strip


【解决方案1】:

给定数字,您可以制造名称并使用mv 命令:

#!/bin/bash
for i in {1..250}
do
    mv "-=$i=- Folder#$i" "Folder#$i"
done

使用基于 Perl 的 rename 命令(有时称为 prename),您可以使用:

rename 's/-=\d+=- //' -=*=-*Folder#*

或者,给定修改后的问题(模式后面的信息不固定):

rename 's/-=\d+=- //' -=*=-*

这行得通!你能解释一下它是如何工作的吗? \d+ 是干什么用的?

\d 是数字 0..9 的 Perl 正则表达式。 + 修饰符表示“一个或多个”。因此,s/-=\d+=- // 的正则表达式部分查找减号、等号、一个或多个数字、等号、减号和空格。替换部分将所有匹配的材料转换为空字符串。它全部被单引号包围,因此 shell 不理会它(尽管该替代命令中只有反斜杠是 shell 元字符,但如果您省略引号,则需要保护反斜杠和空格)。


我不确定您将如何使用基于 C 语言的rename 命令来完成这项工作;它远不如基于 Perl 的版本强大。

【讨论】:

  • rename 's/-=\d+=- //' -=*=-* 这行得通!你能解释一下它是如何工作的吗? \d+ 是干什么用的?
猜你喜欢
  • 2016-05-12
  • 2011-12-25
  • 1970-01-01
  • 2014-07-17
  • 2015-02-25
  • 2014-12-15
  • 2016-01-25
  • 1970-01-01
  • 2013-06-18
相关资源
最近更新 更多