9

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

  • 模板_x.txt
  • 模板_y.txt
  • 模板_z.txt

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

  • foo_x.txt
  • foo_y.txt
  • foo_z.txt

有没有一些简单的方法可以用一个命令来做到这一点,例如

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

4

8 回答 8

11
for f in template_*.txt; 做 cp $f foo_${f#template_}; 完毕
于 2008-08-25T17:26:57.503 回答
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
于 2008-08-25T17:25:23.827 回答
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
于 2008-09-18T01:07:58.250 回答
2

这应该有效:

for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
于 2008-08-25T17:24:13.457 回答
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
于 2008-08-25T17:21:13.150 回答
1
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done

如果您的文件名中包含时髦的字符,则可能会中断。当(如果)您确信它可以可靠地工作时,请删除“-v”。

于 2008-08-25T17:21:35.990 回答
1

该命令mmv(在DebianFink中可用或易于自己编译)正是为此任务创建的。使用普通的 Bash 解决方案,我总是需要查找有关变量扩展的文档。但是mmv使用起来要简单得多,非常接近“厉害”!;-)

你的例子是:

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

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

于 2008-09-15T15:32:10.163 回答
0

还有另一种方法:

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

我一直对 ImageMagick转换程序印象深刻,它可以满足您对图像格式的期望:

$ convert rose.jpg rose.png

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

$ mogrify -format png *.jpg

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

于 2008-08-27T23:49:17.833 回答