2016-01-24 223 views
2

一堆我有一个目录,看起来有点像这样:bash脚本来重命名文件夹

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个文件夹。

+0

'rename'命令是基于Perl还是相对简单的C程序? –

+0

更新了问题,在剥离开始部分后,目录名称未由数字标识。我有重命名的珍珠版本。 – Tominos

+0

现在你有一个不同的问题;目录名称部分总是一样吗?你应该显示' - = 1 = -directoryname'和' - = 2 = -nameofdirectory'和' - = 3 = -directory'和' - = 4 = -name'或者其他类似的区别,以使它更清晰处理。如果你有Perl'rename'(Perl中没有'a'),那么我的答案可以被修改;例如,只需将glob更改为' - = * = - *'。如果没有空格,请从'/ /'命令正则表达式中删除空格。等 –

回答

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的版本强大得多。

+0

重命名'/ - = \ d + = - //' - = * = - *这工作!你能解释它是如何工作的吗? \ d +为什么? – Tominos