![根据其他文件名和类型将一个文件复制到多个文件](https://linux22.com/image/901719/%E6%A0%B9%E6%8D%AE%E5%85%B6%E4%BB%96%E6%96%87%E4%BB%B6%E5%90%8D%E5%92%8C%E7%B1%BB%E5%9E%8B%E5%B0%86%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%88%B0%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我有一堆以一组字母(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].png
,fsws.png[back].png
。虽然在 GUI(Xfce)中很容易进行批量重命名以删除.png
中间的 ,但这似乎有点多余。
我如何仅抓取我需要的文件名部分,即四个字母,附加[back]
然后保留后缀,因为我想对许多文件类型执行此操作而不仅限于.png
。
为了简化,我如何复制文件以便将名称插入到另一个名称的中间,而使已经存在的所有文件保持不变?
答案1
使用 shell参数扩展到
删除直到(如果文件名本身包含最后一个句点的话)句点的所有内容,并将结果保存为扩展名
ext="${file##*.}"
删除扩展名,然后添加回新的后缀 + 扩展名
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\].png
并copy
以所需的文件名创建新文件。 - 仅捕获
${v%%.*}
您需要的文件名部分,不包含扩展名!