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

公众号