代码之家  ›  专栏  ›  技术社区  ›  Patrick McElhaney

bash one liner:将模板_*.txt复制到foo_*.txt?

  •  9
  • Patrick McElhaney  · 技术社区  · 16 年前

    假设我有三个文件(模板*.txt):

    • 模板,x.txt
    • 模板程序
    • TimeLab.Z.TXT

    我想把它们复制到三个新文件(foo_*.txt)。

    • Fuxyx.txt
    • Fuffy.txt
    • FuffyZ.TXT

    有没有简单的方法可以通过一个命令来实现这一点,例如

    cp --enableAwesomeness template_*.txt foo_*.txt

    8 回复  |  直到 12 年前
        1
  •  11
  •   Orion Edwards    16 年前
    对于模板中的f,请执行cp$f foo_f_template_done
    
        2
  •  3
  •   Matt McMinn    16 年前
    [01:22 PM] matt@Lunchbox:~/tmp/ba$
    ls
    template_x.txt  template_y.txt  template_z.txt
    
    [01:22 PM] matt@Lunchbox:~/tmp/ba$
    for i in template_*.txt ; do mv $i foo${i:8}; done
    
    [01:22 PM] matt@Lunchbox:~/tmp/ba$
    ls
    foo_x.txt  foo_y.txt  foo_z.txt
    
        3
  •  3
  •   Roberto Bonvallet Sebastian Celestino    12 年前

    我喜欢的方式:

    for f in template_*.txt
    do
      cp $f ${f/template/foo}
    done
    

    “I-don-notmember-the-substitution-syntax”的方式:

    for i in x y z
    do
      cp template_$i foo_$
    done
    
        4
  •  2
  •   Chris Bartow    16 年前

    这应该有效:

    for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
    
        5
  •  1
  •   pauldoo    16 年前
    for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done
    

    如果文件名中包含时髦字符,则可能会中断。当(如果)你确信它工作可靠时,去掉“-v”。

        6
  •  1
  •   Bruno De Fraine    16 年前

    命令 mmv (可在 Debian Fink 或者很容易编译自己)就是为这个任务创建的。对于纯bash解决方案,我总是需要查找有关变量扩展的文档。但是 MMV 使用起来简单多了,非常接近“令人敬畏”!;-)

    你的例子是:

    mcp "template_*.txt" "foo_#1.txt"
    

    MMV 也可以处理更复杂的模式,并且它进行了一些健全性检查,例如,它将确保目标集中的任何文件都不会出现在源集中(这样您就不会意外地覆盖文件)。

        7
  •  1
  •   Blair Conrad    16 年前

    我不知道bash或cp中的任何内容,但是有一些简单的方法可以使用(例如)Perl脚本来完成这类工作:

    ($op = shift) || die "Usage: rename perlexpr [filenames]\n";
    
    for (@ARGV) {
        $was = $_;
        eval $op;
        die $@ if $@;
        rename($was,$_) unless $was eq $_;
    }
    

    然后:

    rename s/template/foo/ *.txt
    
        8
  •  0
  •   Jon Ericson Homunculus Reticulli    16 年前

    另一种方法是:

    $ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx
    

    我一直对ImageMagick印象深刻 convert 使用图像格式执行所需操作的程序:

    $ convert rose.jpg rose.png
    

    它有一个姊妹程序,允许批量转换:

    $ mogrify -format png *.jpg
    

    显然,这些仅限于图像转换,但它们有有趣的命令行接口。