2013-03-05 36 views
0

设计bash脚本我必须做一个简单的设计,但我不知道该怎么办呢用于提取未知的文件名部分

我有两个文件夹folderA和文件夹B. folderA的里面我有一个名为两个文件“file_”和“file_anything”。第二个文件的“任何”部分是我不知道的一些文本(或者对于各种文件夹可能不同)。我需要做的是将folderB的名称更改为任何文字为“任何东西”,而无需特别了解

如果超出了程序,我会感到欣慰的是有人给我一个链接,指向您用来理解和能够修改或适应其他情况的solutuions。我想学习

感谢

编辑: 我需要这个解决方案将包括在要被重复了很多具有相同estructure文件夹的夫妇bash脚本(无Perl函数)内。例如:

FolderA(与文件 “_文件” 和 “file_manana”)和FolderB中---变化---> FolderA和晨报(原FolderB中)

FolderC(与文件 “_文件” 和“ File_monkey“)和FolderD ---更改为---> FolderA和Monkey(前FolderD)

FolderE(带有文件”file_“和”file_moose“)和FolderF ---更改为---> FolderA和驼鹿(原FolderF)

很多很多次多了很多文件夹

埃德它2:

好吧,我越来越近。现在的问题是这样的:我这样定义fn:fn = file_a *知道该文件夹中只有一个与该指令相匹配的文件。我确认这样做echo $ fn。现在我这样做:fn = $ {fn ## * _}。但是,fn不会变成“任何东西”,而是变成“a *”。我该如何解决这个问题? @David Zaslavsky

编辑3:Thx @chepner。 BASH_REMATCH是要走的路。我用它一点点的改变,因为你写的方式didin't为我工作

for f in FolderA/file_*; do # I assume a single match 
[[ $f =~ "file_"(.*) ]] 
suffix=${BASH_REMATCH[1]} 
mv FolderB "$suffix" 
done 

注意引号。他们之间,我甚至可以包含空格

THX大家

+0

我不确定要理解你的问题,但我认为'rename' cmd可以帮助你。你只给出一个'ed'命令来重命名文件。例如:'s/file _ //'删除这部分。 – Zulu 2013-03-05 22:30:18

回答

0

我不太明白你的最终结果应该是什么,但你可以用下面的提取file_anything后部分:

$ f="file_manana" 
$ [[ $f =~ file_(.*) ]] 
$ suffix=${BASH_REMATCH[1]} 
$ echo $suffix 
manana 

所以,我觉得你想要做的就是

for f in FolderA/file_*; do # I assume a single match 
    [[ $f =~ file_(.*) ]] 
    suffix=${BASH_REMATCH[1]} 
    mv FolderB "$suffix" 
done 
0

你要查找的Bash manual参数扩展。如果你在一个变量存储file_anything的名字,让我们说fn,您可以使用${fn##*_}删除最长前缀从文件名匹配*_,然后你可以使用在mv命令重命名文件夹B.

+0

好吧,我越来越近了。现在的问题是这样的:我这样定义fn:fn = file_a *知道在那个地毯中只有一个文件与该指令相匹配。我确认这样做echo $ fn。现在我这样做:fn = $ {fn ## * _}。但是,fn不会变成“任何东西”,而是变成“a *”。我该如何解决这个问题? @David Zaslavsky – Tojur 2013-03-05 23:14:05

+1

请不要尝试在评论部分优化您的问题定义。编辑您的问题以包含格式化的样本输入以及来自该输入的所需输出。祝你好运。 – shellter 2013-03-05 23:21:33

+0

@ user1620160什么shellter说。你的评论正在问一些不同的东西;原始问题中没有通配符。如果你可以提供一些实际的文件名,它可能会有所帮助。 – 2013-03-05 23:23:10