我有一堆以一组字母(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%%.*}
您需要的文件名部分,不包含扩展名!