如何在 Linux 中将所有 .yml.sample 文件复制并重命名为 .yml?

use*_*021 1 bash

bash想复制.yml.sampleGit 存储库中的所有文件(递归地)并将它们重命名为只有.yml extension.

\n\n

例如。test.yml.sample将被复制到test.yml

\n\n

Here\xe2\x80\x99s 与我\xe2\x80\x99 一样接近,但我不清楚.sample复制时如何去掉文件名的末尾。

\n\n
find . -depth -name "*.yml.sample" -exec sh -c \'cp "$1" "${1%/.sample/}"\' _ {} \\;\n
Run Code Online (Sandbox Code Playgroud)\n

Jak*_*uld 5

这应该有效:

\n\n
find . -depth -name "*.yml.sample" -exec sh -c \'cp -p "$1" "${1%.yml.sample}.yml"\' _ {} \\;\n
Run Code Online (Sandbox Code Playgroud)\n\n

第一个*.yml.sample通过 查找文件find。然后-exec,在该部分之后,通过获取该viacp的结果,然后通过其中设置复制文件的文件扩展名来设置复制文件的文件扩展名,其中是源扩展名,并且是新的目标扩展名,神奇的事情发生了。find$1${1%.yml.sample}.yml.yml.sample.yml

\n\n

注意我还添加了该-p属性以将源文件中的属性保留到复制的文件中。您可能不需要它,但我认为在进行这样的复印时它会很有帮助。

\n\n

而\xe2\x80\x94由于这个shell逻辑可能会令人困惑\xe2\x80\x94就 而言_ {} \\;,它分解如下:

\n\n
    \n
  • _ {}:正如Unix/Linux Stack Exchange 站点上的这个答案所解释的那样, \xe2\x80\x9c 的工作方式是 bash 将后面的参数作为-c参数,_ {}因此需要将 的内容{}分配给$1not l.\xe2\x80\ x9d
  • \n
  • \\;:当您使用find参数运行时-exec,之后发生的所有事情都会通过新的 shell 进行解析。这意味着主find命令在一个父 shell 中运行,然后-exec在另一个子 shell 命令中运行。如果您将其运行为_ {} ;,则子 shell 命令将终止。因此,您将其转义为这样\\;_ {} \\;这意味着只有父 sellfind会将其解释;为 \xe2\x80\x9cterminate\xe2\x80\x9d ,因此 parenfind命令可以成功运行迭代命令,-exec而无需停止该子 shell 命令。请阅读-exec command ;此处
  • \n
\n