Bash One Liner: скопировать шаблон _ *. Txt в foo _ *. Txt?

Скажем, у меня есть три файла (шаблон _ *. 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

25.08.2008 17:18:50
8 ОТВЕТОВ
РЕШЕНИЕ
для f в шаблоне _ *. txt; do cp $ f foo _ $ {f # template_}; сделанный
11
28.08.2008 00:02:11

Я ничего не знаю ни в 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
1
25.08.2008 17:21:13
В моей системе Debian в /usr/bin/rename(часть perlпакета) установлен Perl-скрипт, который делает именно это.
Adam Monsen 6.06.2012 00:12:12
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done

Вероятно, ломается, если в ваших именах файлов есть прикольные символы. Удалите '-v', когда (если) вы получите уверенность в том, что он работает надежно.

1
25.08.2008 17:21:35

Это должно работать:

for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
2
25.08.2008 17:24:13
[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
25.08.2008 17:25:23

Еще один способ сделать это:

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

Я всегда был впечатлен программой преобразования ImageMagick, которая делает то, что вы ожидаете с форматами изображений:

$ convert rose.jpg rose.png

У него есть родственная программа, которая позволяет пакетные преобразования:

$ mogrify -format png *.jpg

Очевидно, что они ограничены преобразованиями изображений, но у них есть интересные интерфейсы командной строки.

0
27.08.2008 23:49:17

Команда mmv(доступная в Debian или Fink или легко компилируемая) была создана именно для этой задачи. С простым решением Bash мне всегда нужно искать документацию о расширении переменных. Но mmvгораздо проще в использовании, довольно близко к «удивительности»! ;-)

Ваш пример будет:

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

mmv также может обрабатывать более сложные шаблоны и имеет некоторые проверки работоспособности, например, он гарантирует, что ни один из файлов в наборе назначения не появится в исходном наборе (поэтому вы не можете случайно перезаписать файлы).

1
15.09.2008 15:32:10

Мой предпочтительный способ:

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
7.06.2012 16:42:22