【问题标题】:How to copy and rename all .yml.sample files to be .yml in Linux?如何在 Linux 中将所有 .yml.sample 文件复制并重命名为 .yml?
【发布时间】:2019-07-21 23:46:04
【问题描述】:

bash 中,我想复制 Git 存储库中的所有 .yml.sample 文件(递归)并将它们重命名为只有一个 .yml extension

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

这是我所知道的,但我不清楚如何在复制时从文件名的末尾去除.sample

find . -depth -name "*.yml.sample" -exec sh -c 'cp "$1" "${1%/.sample/}"' _ {} \;

【问题讨论】:

    标签: bash


    【解决方案1】:

    这应该可行:

    find . -depth -name "*.yml.sample" -exec sh -c 'cp -p "$1" "${1%.yml.sample}.yml"' _ {} \;
    

    第一个*.yml.sample 通过find 查找文件。然后在-exec 部分之后,通过cp 通过$1 获取find 的结果,然后通过${1%.yml.sample}.yml 设置复制文件的文件扩展名,其中.yml.sample 是源扩展名,而.yml 是新的目标扩展。

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

    而且——由于这个 shell 逻辑可能令人困惑——就 _ {} \; 而言,它分解为:

    • _ {}:正如this answer on the Unix/Linux Stack Exchange site 中所解释的,“这种工作方式是 bash 将 -c 之后的参数作为参数,需要 _ {} 以便将 {} 的内容分配给 $1 而不是 @987654342 @。”
    • \;:当您使用 -exec 参数运行 find 时,之后发生的所有事情都会通过新的 shell 进行解析。这意味着主要的 find 命令在一个父 shell 中运行,-exec 之后的内容在另一个子 shell 命令中运行。如果您以_ {} ; 运行它,子shell 命令将终止。因此,您将其转义为\;,因此您得到_ {} \;,这意味着只有父销售find 会将; 解释为“终止”,因此paren find 命令可以通过以下方式成功运行迭代命令-exec 无需停止该子 shell 命令。阅读-exec command ; here

    【讨论】:

    • 这几乎可以工作,但我收到以下错误:find: -exec: no terminating ";" or "+"。如下更新它:find . -depth -name "*.yml.sample" -exec sh -c 'cp -p "$1" "${1%.yml.sample}.yml"' _ {} \;
    • @user1255021 很高兴这个帮助!嗯......不太清楚你改变了什么或原来的问题是什么。刚刚测试了我的脚本并且它有效。当我复制对你有用的东西时,它看起来就像是完全相同的代码行。
    • @JakeGould 非常感谢。我需要这个来复制非高清文件并将其重命名为 cocos2d 的高清文件。它工作得很好。寻找 。 -depth -name "*.png" -exec sh -c 'cp -p "$1" "${1%.png}-hd.png"' _ {} \;
    • 谢谢,这对我有用!你有一个问题:_ {} \; 是干什么用的?
    • @fceruti 好问题。老实说,Bash 是编程和控制逻辑的另一个星球;我的意思是说真的_ {} \; 并没有完全从舌头上滚下来。我已经更新了我的问题以解决那些东西是什么以及逻辑/推理是什么。更多信息可以found here以及as here
    【解决方案2】:

    我认为您可以使用mmv 之类的工具来批量重命名您需要的所有文件。

    mmv \*.yml.sample \#1.yml
    

    上面的行应该可以工作......只要确保先测试它。希望这会有所帮助!


    编辑:如果您想复制并重命名,只需一步,您可以使用-c 标志。这将保留原始文件,并使用重命名掩码进行复制。

    mmv -c \*.yml.sample \#1.yml
    

    【讨论】:

    • 这不是就地重命名文件的情况。原始海报指出,“在 bash 中,我想 复制 Git 存储库中的所有 .yml.sample 文件(递归地)并将它们重命名为仅具有 .yml 扩展名。”
    • @JakeGould 好的,那么为什么他不能复制文件然后重命名它们?我认为他的主要问题是如何复制(或重命名文件)剥离文件名中的 .sample 部分。
    • “好的,那为什么他不能复制文件然后重命名呢?”确切地。就是那个问题。请参阅我的答案,其中我解释了如何使用 find 完成此操作。
    • 太棒了!但并非所有系统都安装了mmv,也不是所有用户都有能力安装它。 find 更常用,因为它安装在几乎所有的 Linux/Unix 系统上,如果某个系统安装在 BSD 系统(如 Mac OS X)或 GNU 系统(如 Ubuntu)上,则功能之间只有很小的差异。
    • 加一个用于不那么冗长的示例
    猜你喜欢
    • 2015-07-29
    • 2010-09-14
    • 2015-08-15
    • 2020-03-24
    • 2015-03-21
    • 2013-11-24
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多