【问题标题】:copy file n times and rename it with specific names复制文件 n 次并用特定名称重命名
【发布时间】:2020-05-16 03:36:18
【问题描述】:

假设我在文件夹 /home/test/ 中有一个名为 bash.sh 的 bash 脚本,在这个文件夹中我还有另外 5 个文件,命名为:file_1a.nc file_1b.nc file_2a.nc file_6a.nc file_6b.nc

我想复制bash.sh 5次,新的副本需要与.nc文件同名,如下:

file_1a_bash.sh file_1b_bash.sh file_2a_bash.sh file_6a_bash.sh file_6b_bash.sh

有什么建议吗? 谢谢

【问题讨论】:

    标签: bash copy rename


    【解决方案1】:

    您可以早点将answer 应用到您的案例中

    find /home/test/ -type f -name '*.nc' | while read f; do 
    mv "$f" "${f%.nc}_bash.sh"; 
    

    您也可以在/home/test/ 中使用ls -1 而不是find

    for f in `ls -1 file_*` ; do 
    cp ${f} "${f%.nc}"_bash.sh; 
    done
    

    【讨论】:

    • 我会为 f in file_* 做;做 cp "${f}" "${f%.nc}"_bash.sh; done 使用 ls 循环文件不方便,改用 glob 表示法。并始终保护您的 vars 双引号。您可以查看shellcheck.net
    • 这里既不需要find也不需要ls
    【解决方案2】:

    这只是bash Parameter Expansion处理的一个简单案例。

    for f in file_*.nc; do cp bash.sh "${f%.nc}_bash.sh"; done
    

    【讨论】:

    • 这个想法对我来说似乎不错,但Shellcheck 识别出代码中缺少的引号。
    • @pjh 缺少引号在这种特殊情况下不会成为问题,因为 OP 中的样本不包含空格或任何其他元字符。请不要让 shellcheck 成为另一个货物崇拜
    • 尽管如此,除非有充分且明确的理由不这样做,否则总是加上引号是一个好习惯。我只是想让示例保持最小化和简单化以强调这一点,但现在已经完成,我会将它们添加为良好的形式。
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2018-11-29
    • 2013-07-14
    • 2021-10-02
    • 2018-06-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多