2012-07-09 79 views
0

我有一个文件夹列表。例如每个文件夹的名称:Bash Shell Loop Over文件夹组合

  • 包含文件pippo1.txt pippo1,
  • pippo2包含文件pippo2.txt,
  • 包含文件pippo3.txt等pippo3

我想要进入第一个文件夹,从文件名pippo1.txt中删除数字,然后退出,进入名为pippo2的第二个文件夹,其中包含文件pippo2.txt,从文件名等删除2等等。我尝试了下面的代码,但它不起作用!代码:

for i in * 
do 
    cd $i 
    ls *.txt | sed -e "s/[0-9]//g" 
    cd .. 
done 

我在做什么错?

+0

有几个问题。 1)每个文件夹中只有1个文本文件吗? 2)你知道'sed'实际上并没有重命名文件吗?你需要使用'mv'。 – Squazic 2012-07-09 18:32:06

+0

请更具体。难道这'bash'或'sh'和什么口味的Unix/Linux的是什么? – Anders 2012-07-09 18:39:13

+0

是的!每个文件夹有1个.txt文件。我有完全14.669文件夹 – Elb 2012-07-09 19:59:14

回答

2

如果要求只是这么简单,那么你可以只用bash的替代做到这一点:

for file in `find . -name 'pippo*.txt'`; do 
    mv $file ${file/[0-9].txt/.txt} 
done 

然而,这将在文件名上,例如超过个位数失败pippo999/pippo999.txt。这可以通过设置extglob选项来解决:当extglob设置

shopt -s extglob 
for file in `find . -name 'pippo*.txt'`; do 
    mv $file ${file/+([0-9]).txt/.txt} 
done 

+(...)结构在bash文件寻找才可用。

而是用一个循环,并cd遍历目录树,这里采用find获得所有相关文件的列表,然后遍历文件名的该列表,这将是这样的形式:./pippoN/pippoN.txt。重命名使用bash parameter replacement获取修改的文件名。另请参阅filename expansion

注意在文件或目录名称中的空格将打破这种方法,使用的find开始:包含空格的路径将被分成多个标记周围的空间,每个令牌是一个单独的结果在列表迭代器。所以,如果你需要预见的路径空格字符则它就会成为一个比较复杂:

shopt -s extglob 
IFS=$'\n' 
for file in `find . -name 'pippo*.txt'`; do 
    mv "$file" "${file/+([0-9]).txt/.txt}" 
done 

这里我们引用了mv命令,将正确处理空格的文件名,我们已经改变了字段分隔符IFS,以便bash不会将空白识别为字边界。这将修复循环迭代器中find的问题。现在路径中的空格将被正确处理,例如, ./pippo 9/pippo9.txt也将重新命名为:./pippo 9/pippo.txt

+0

你或许应该包括变量名称的报价在'mv'命令,以避免在文件空间(ETC)的问题名。然而,使用从'find'输出也意味着有问题,如果文件名包含空格。 – 2012-07-09 21:02:23

+0

@JonathanLeffler好点啊我会意味着包括并没有在查找结果空间考虑的问题。我会添加关于这个与空间断裂的blurb。 – pb2q 2012-07-09 21:07:34

2

切换目录时,调用子shell是最好也是最干净的。

重命名文件时,通常最好使用本地rename命令或获取一个。麻烦的是,有几个'标准'rename命令,分布更广泛的命令远不如基于Perl的命令强大。这种方法避免了rename,但不完全是可取的:

for dir in * 
do 
    (
    cd "$dir" 
    for file in *[0-9].txt 
    do 
     mv "$file" $(echo "$file" | sed 's/[0-9]\.txt$/.txt/') 
    done 
    ) 
done 

的基于Perl rename需要一个正则表达式作为第一个参数,并将其应用到文件名:

for dir in * 
do 
    (
    cd "$dir" 
    rename 's/\d\.txt$/.txt/' *[0-9].txt 
    ) 
done 

这是更可靠。