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

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

我当前的脚本看起来像这样.但是,我似乎无法找到一种方法来使用通配符中的文件名称作为文件名;

for f in /usr/share/storage/*/log/myfile.log*; do cp "$f" /myhome/docs/log/myfile.log; done

我现有的文件夹结构/文件如下,我希望将文件复制为;

>/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

解决方法:

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

一旦你这样做,使用各种参数扩展操作符来提取你想要使用的路径和文件名的部分是一件简单的事情.

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

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...