Bash一行命令:将template_*.txt复制到foo_*.txt?

9
我有三个文件(template_*.txt):
  • template_x.txt
  • template_y.txt
  • template_z.txt
我想将它们复制到三个新文件中(foo_*.txt)。
  • foo_x.txt
  • foo_y.txt
  • foo_z.txt
是否有一种简单的方法可以使用一个命令来完成,例如: cp --enableAwesomeness template_*.txt foo_*.txt
8个回答

11
对于每个名为template_*.txt的文件,执行以下操作:将其复制到名为foo_*.txt的新文件中。

3

我个人偏爱的方式:

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

「我不记得替换语法是什么」的方式:
for i in x y z
do
  cp template_$i foo_$
done

3
[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

2

这应该可以工作:

for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done

1

我不知道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

在我的Debian系统上,有一个Perl脚本安装在/usr/bin/rename(属于perl软件包的一部分),几乎完全可以做到这一点。 - Adam Monsen

1
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done

如果您的文件名中有奇怪的字符,可能会出现错误。当您确信它可以可靠地工作时,请删除“-v”。


1

命令mmv(在DebianFink可用,或者可以方便地自行编译)是专为此任务创建的。对于纯Bash解决方案,我总是不得不查找有关变量扩展的文档。但是使用mmv要简单得多,非常接近“了不起”! ;-)

您的示例将是:

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

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


0

另一种方式是:

$ 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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接