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

Если вы хотите объединить три или более проектов в одном коммите, выполните действия, описанные в других ответах (remote add -f, merge). Затем (мягкий) сбросьте индекс на старую голову (где не произошло слияния). Добавьте все файлы (git add -A) и скопируйте их (сообщение «Объединение проектов A, B, C и D в один проект). Теперь это идентификатор commit.

Теперь создайте .git/info/grafts со следующим содержимым:

 

Запустить git filter-branch -- head^..head head^2..head head^3..head. Если у вас более трех ветвей, просто добавьте столько же head^n..head, сколько у вас есть ветви. Чтобы обновить теги, добавьте --tag-name-filter cat. Не всегда добавляйте это, потому что это может привести к перезаписи некоторых коммитов. Подробнее см. В странице man filter-branch , найдите «трансплантаты».

Теперь, ваш последний commit имеет соответствующих родителей.

9
задан Patrick McElhaney 25 August 2008 в 17:18
поделиться

8 ответов

for f in template_*.txt; do cp $f foo_${f#template_}; done
11
ответ дан 4 December 2019 в 09:39
поделиться
[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
ответ дан 4 December 2019 в 09:39
поделиться

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

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

"I-don't-remember-the-substitution-syntax" путь:

for i in x y z
do
  cp template_$i foo_$
done
3
ответ дан 4 December 2019 в 09:39
поделиться

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

for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
2
ответ дан 4 December 2019 в 09:39
поделиться

Я ни о чем не знаю в ударе или на CP, но существуют простые способы сделать этот вид вещи, использующей (например), сценарий жемчуга:

($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
ответ дан 4 December 2019 в 09:39
поделиться
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done

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

1
ответ дан 4 December 2019 в 09:39
поделиться

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

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

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

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

1
ответ дан 4 December 2019 в 09:39
поделиться

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

$ 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
ответ дан 4 December 2019 в 09:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: