根据其他文件名和类型将一个文件复制到多个文件

根据其他文件名和类型将一个文件复制到多个文件

我有一堆以一组字母(c、f、s 和 w)命名的文件,例如:cccf.png、、fsws.png等等。还有一个文件我需要复制,以使这些名称与[back]名称中的 a 匹配,例如:cccf[back].png、、fsws[back].png等等。

我努力了

for file in ./????.png; do
  cp Back.png "$file"[back].png
done

这给了我cccf.png[back].pngfsws.png[back].png。虽然在 GUI(Xfce)中很容易进行批量重命名以删除.png中间的 ,但这似乎有点多余。

我如何仅抓取我需要的文件名部分,即四个字母,附加[back]然后保留后缀,因为我想对许多文件类型执行此操作而不仅限于.png

为了简化,我如何复制文件以便将名称插入到另一个名称的中间,而使已经存在的所有文件保持不变?

答案1

使用 shell参数扩展

  1. 删除直到(如果文件名本身包含最后一个句点的话)句点的所有内容,并将结果保存为扩展名

    ext="${file##*.}"
    
  2. 删除扩展名,然后添加回新的后缀 + 扩展名

    backfile="${file%.*}[back].${ext}"
    

前任。

file=cccf.png
ext="${file##*.}"
backfile="${file%.*}[back].${ext}"
echo "$backfile"
cccf[back].png

答案2

通过以下方式尝试该命令:

for f in ./*
do
  v="$(basename "$f")"
  cp Back.png "${v%%.*}"\[back\].png
done

脚本信息:

  • 用于v="$(basename "$f")"获取文件名
  • 使用cp Back.png "${v%%.*}"\[back\].pngcopy以所需的文件名创建新文件。
  • 仅捕获${v%%.*}您需要的文件名部分,不包含扩展名!

相关内容