设计bash脚本以提取未知文件名部分

时间:2013-03-05 22:22:01

标签: bash

我必须做一个简单的设计,但我不知道该怎么做

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

如果超出程序,有人会给我链接到你用来理解并能够修改或修改其他情况的解决方案,我会很感激。我想学习

谢谢

编辑: 我需要将这个解决方案包含在一个bash脚本(没有perl函数)中,这些脚本将被重复用于具有相同结构的许多文件夹对。例如:

FolderA(文件“file_”和“file_manana”)和FolderB ---更改为---> FolderA和manana(前FolderB)

FolderC(文件“file_”和“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是要走的路。我使用它有点变化,因为你写它的方式对我不起作用

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

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

大家好

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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