1

在 Linux 上,命令:

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

无法按预期工作,因为在文件扩展名之后附加了“_copy”字符串,foo.png_copy而不是foo_copy.png. 我如何解决它?我可以切片字符串吗?

4

3 回答 3

6
for f in *; do
    prefix="${f%.*}"
    suffix="${f:${#prefix}}"
    cp "$f" "${prefix}_copy${suffix}"
done

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

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

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

于 2013-05-13T04:55:34.150 回答
2

如果文件名只有一个句点

rename ".png" "_copy.png"  *.png

更多的

man rename
于 2013-05-17T06:47:37.977 回答
2

使用basename,传递第二个参数:

for f in *; do
    cp "$f" "$(basename "$f" .png)_copy.png"
done

根据basename(1)

概要

basename 字符串[后缀]

描述

basename实用程序删除 [...]后缀(如果给定)。

于 2013-05-13T04:24:29.817 回答