假设我有三个文件(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
假设我有三个文件(template_*.txt):
我想将它们复制到三个新文件(foo_*.txt)。
有没有一些简单的方法可以用一个命令来做到这一点,例如
cp --enableAwesomeness template_*.txt foo_*.txt
for f in template_*.txt; 做 cp $f foo_${f#template_}; 完毕
[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
我的首选方式:
for f in template_*.txt
do
cp $f ${f/template/foo}
done
“我不记得替换语法”的方式:
for i in x y z
do
cp template_$i foo_$
done
这应该有效:
for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
我不知道 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
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done
如果您的文件名中包含时髦的字符,则可能会中断。当(如果)您确信它可以可靠地工作时,请删除“-v”。
还有另一种方法:
$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx
我一直对 ImageMagick转换程序印象深刻,它可以满足您对图像格式的期望:
$ convert rose.jpg rose.png
它有一个允许批量转换的姊妹程序:
$ mogrify -format png *.jpg
显然,这些仅限于图像转换,但它们具有有趣的命令行界面。