`for f in*; 做cp"$ f""$ f"_copy; 完成`不起作用,因为"foo.png_copy".怎么解决?

Mai*_*tor 1 linux bash shell terminal

在Linux上,命令:

for f in *; do cp "$f" "$f"_copy; done

如预期,因为"_copy"字符串的文件扩展名后附加,成为不工作foo.png_copy来代替foo_copy.png.我如何解决它?我可以切片吗?

Gor*_*son 6

for f in *; do
    prefix="${f%.*}"
    suffix="${f:${#prefix}}"
    cp "$f" "${prefix}_copy${suffix}"
done
Run Code Online (Sandbox Code Playgroud)

这通过修剪匹配".*"的后缀来查找文件名的前缀.请注意,如果文件名没有扩展名,则这将是整个文件名; 如果它有多个句点,它只会删除最后一个句点(例如,对于一个名为"this.that.etc.png"的文件,它将被修剪为"this.that.etc").然后通过根据前缀(${#prefix})的长度切片文件名来找到后缀; 无论是否删除了任何内容,这都可以正常工作.

警告:这将处理任何带有句点的文件名具有扩展名.例如,"file_v1.0"将被复制到"file_v1_copy.0".

注意:如果您愿意,可以跳过定义$ suffix,并${f:${#prefix}}在复制命令中使用内联,但我认为这更清楚.