Сведения о вопросе

HEIGTH

16:38, 26th August, 2020

Теги

bash    

Bash один лайнер: копировать template_*.txt в foo_*.txt?

Просмотров: 420   Ответов: 8

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



  Сведения об ответе

LAST

21:04, 26th August, 2020

for f in template_*.txt; do cp $f foo_${f#template_}; done


  Сведения об ответе

PAGE

09:12, 13th August, 2020

[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


  Сведения об ответе

qwerty101

20:26, 8th August, 2020

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

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

Путь "я-не t-remember-the-substitution-syntax":

for i in x y z
do
  cp template_$i foo_$
done


  Сведения об ответе

+-*/

16:01, 1st August, 2020

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

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


  Сведения об ответе

fo_I_K

12:38, 5th August, 2020

Я ничего не знаю в 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


  Сведения об ответе

COOL

16:09, 1st August, 2020

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

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


  Сведения об ответе

dump

05:13, 4th August, 2020

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

Ваш пример был бы:

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

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


  Сведения об ответе

ЯЯ__4

04:02, 24th August, 2020

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

$ 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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться