Bash One Liner: скопировать шаблон _ *. Txt в foo _ *. Txt? - PullRequest
9 голосов
/ 25 августа 2008

Скажем, у меня есть три файла (шаблон _ *. 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 голосов
/ 25 августа 2008
for f in template_*.txt; do cp $f foo_${f#template_}; done
3 голосов
/ 18 сентября 2008

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

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 голосов
/ 25 августа 2008
[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 голосов
/ 25 августа 2008

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

for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
1 голос
/ 15 сентября 2008

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

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

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

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

1 голос
/ 25 августа 2008
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done

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

1 голос
/ 25 августа 2008

Я ничего не знаю в 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
0 голосов
/ 28 августа 2008

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

$ 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...