在 Linux 上,命令:
for f in *;做 cp "$f""$f"_copy;完成
没有按预期工作,因为“_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}}
,但我认为这样更清楚。
关于linux - `for f in *; do cp "$f ""$f "_copy; done` 没有 't work because "foo.png_copy”。如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514823/