首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux bash如何在复制命令中使用通配符的结果作为文件名

Linux bash如何在复制命令中使用通配符的结果作为文件名
EN

Stack Overflow用户
提问于 2019-01-28 17:57:36
回答 3查看 832关注 0票数 3

我正在编写一个Linux脚本,将文件从文件夹结构复制到一个文件夹中。我想使用一个不同的文件夹名作为文件名的前缀。

我现在的剧本是这样的。但是,我似乎无法找到使用通配符中的文件夹名作为文件名的方法;

代码语言:javascript
复制
for f in /usr/share/storage/*/log/myfile.log*; do cp "$f" /myhome/docs/log/myfile.log; done

我现有的文件夹结构/文件如下所示,我希望按以下方式复制文件;

代码语言:javascript
复制
>/usr/share/storage/100/log/myfile.log    -->    /myhome/docs/log/100.log
>/usr/share/storage/100/log/myfile.log.1  -->    /myhome/docs/log/100.log.1
>/usr/share/storage/102/log/myfile.log    -->    /myhome/docs/log/102.log
>/usr/share/storage/103/log/myfile.log    -->    /myhome/docs/log/103.log
>/usr/share/storage/103/log/myfile.log.1  -->    /myhome/docs/log/103.log.1
>/usr/share/storage/103/log/myfile.log.2  -->    /myhome/docs/log/103.log.2
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-28 18:17:55

您可以使用正则表达式匹配来提取所需的组件,但可能更容易更改为/usr/share/storage,以便所需组件始终是路径上的第一个组件。

一旦这样做,使用各种参数展开操作符提取要使用的路径和文件名的部分就很简单了。

代码语言:javascript
复制
cd /usr/share/storage
for f in */log/myfile.log*; do
    pfx=${f%%/*}  # 100, 102, etc
    dest=$(basename "$f")
    dest=$pfx.${dest#*.}
    cp -- "$f" /myhome/docs/log/"$pfx.${dest#*.}"
done
票数 3
EN

Stack Overflow用户

发布于 2019-01-28 18:16:52

一个选项是将for循环包装在另一个循环中:

代码语言:javascript
复制
for d in /usr/share/storage/*; do
    dir="$(basename "$d")"

    for f in "$d"/log/myfile.log*; do
        file="$(basename "$f")"
        # test we found a file - glob might fail
        [ -f "$f" ] && cp "$f" /home/docs/log/"${dir}.${file}"
    done
done
票数 2
EN

Stack Overflow用户

发布于 2019-01-28 18:17:11

代码语言:javascript
复制
for f in /usr/share/storage/*/log/myfile.log*; do cp "$f" "$(echo $f | sed -re 's%^/usr/share/storage/([^/]*)/log/myfile(\.log.*)$%/myhome/docs/log/\1\2%')"; done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54407719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档