在 Linux 上,命令:
for f in *; do cp "$f" "$f"_copy; done
无法按预期工作,因为在文件扩展名之后附加了“_copy”字符串,foo.png_copy
而不是foo_copy.png
. 我如何解决它?我可以切片字符串吗?
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,但我认为这更清楚。
如果文件名只有一个句点
rename ".png" "_copy.png" *.png
更多的
man rename
使用basename
,传递第二个参数:
for f in *; do
cp "$f" "$(basename "$f" .png)_copy.png"
done
根据basename(1)
:
概要
basename
字符串[后缀]描述
该
basename
实用程序删除 [...]后缀(如果给定)。