linux - `for f in *; do cp "$f ""$f "_copy; done` 没有 't work because "foo.png_copy”。如何解决?

标签 linux bash shell terminal

在 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/

相关文章:

linux - 从远程访问虚拟主机?

linux - 无法理解 x86-64 函数序言

c - 在 Linux 上自己的进程上读取调试/静态符号,而没有 C/Linux 中的磁盘 I/O?

linux - 在VMware机器上抓包

Bash continue [n] 在管道传输到 while read 循环中被忽略。 for 循环的行为符合预期

html - 使用 sed 从文件中删除空的 HTML 标签

Bash:测试多个变量的相互相等性?

bash - unix如何查看一个进程是否挂起

json - 如何读取并解析json文件并将其添加到shell脚本变量中?

linux - 在 shell 脚本中复制时检查磁盘空间