【问题标题】:Design bash script for extract unknown file name section设计用于提取未知文件名部分的 bash 脚本
【发布时间】:2013-03-05 22:22:01
【问题描述】:

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

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

如果在程序之外有人给我一个指向您用来理解并能够修改或适应其他情况的解决方案的主题的链接,我会很感激。我要学习

谢谢

编辑: 我需要将此解决方案包含在 bash 脚本(无 perl 函数)中,该脚本将对许多具有相同结构的文件夹重复。例如:

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

FolderC(带有文件“file_”和“file_monkey”)和FolderD---更改为--->FolderA和monkey(以前的FolderD)

FolderE(带有文件“file_”和“file_moose”)和FolderF---更改为--->FolderA和moose(以前的FolderF)

很多次与更多文件夹

编辑 2:

好的,我越来越近了。现在的问题是:我这样定义 fn:fn=file_a* 知道该文件夹中只有一个与该指示匹配的文件。我确认这样做 echo $fn。现在我这样做:fn=${fn##*_}。但是,fn 不会转换为“anything”,而是转换为“a*”。我该怎么解决? @大卫扎斯拉夫斯基

编辑 3:谢谢@chepner。 BASH_REMATCH 是要走的路。我稍作改动就使用它,因为你写它的方式对我不起作用

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

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

谢谢大家

【问题讨论】:

  • 我不确定你的问题是否理解,但我认为rename cmd 可以帮助你。你只需要一个ed 命令来重命名文件。例如:s/file_// 删除此部分。

标签: bash


【解决方案1】:

我不太明白您的最终结果应该是什么,但您可以使用以下内容提取 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好的,我越来越近了。现在的问题是:我这样定义 fn:fn=file_a* 知道在那块地毯中只有一个文件与该指示匹配。我确认这样做 echo $fn。现在我这样做:fn=${fn##*_}。但是,fn 不会转换为“anything”,而是转换为“a*”。我该怎么解决? @大卫扎斯拉夫斯基
    • 请不要尝试在 cmets 部分细化您的问题定义。编辑您的问题以包含格式化的示例输入以及该输入所需的输出。祝你好运。
    • @user1620160 shellter 说了什么。您的评论是在询问不同的事情;原始问题中没有通配符。如果你能提供一些实际的文件名可能会有所帮助。
    • 确实如此。但是我使用通配符是因为(正如我在原始帖子中所指的那样)我不知道下划线后的文件的确切名称。另外,我正在使用它来应用@DavidZaslavsky 的指示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多