Git Batch переименовать большую часть переданных файлов - PullRequest
0 голосов
/ 23 мая 2019

У меня есть git-репозиторий, в котором зафиксировано несколько тысяч файлов. Я хочу переименовать его с помощью команды командной строки, что-то вроде

git mv *.txt *.md

Но получил сообщение fatal: bad source, source=*.txt, destination=*.md.

Как переименовать переданные файлы с помощью git cli?

Ответы [ 4 ]

3 голосов
/ 23 мая 2019

Для максимальной эффективности процессора, команда Git core update-index может принимать массовые обновления на stdin:

git ls-files -s \*.txt \
| sed -r 's,([^ ]* )(.*)\.txt,0 \2.txt\n\1\2.md,' \
| git update-index --index-info

, который будет обновлять индекс за один проход. Затем вы можете git read-tree сделать обновления дерева работ за один проход с помощью

newtree=`git write-tree`
git read-tree @
git read-tree -u --reset @ $newtree

sed преобразует записи индекса git ls -s, выгруженные в два обновления индекса, запись удаления (режим 0) для старого имени *.txt и вставку для нового *.md. git read-tree - это основная команда, лежащая в основе извлечения и слияния, а также множество других средств массовой обновления для рабочего дерева. Приведенная выше последовательность «напишите дерево для индекса, сбросьте его до его состояния при извлечении, затем прочитайте новое дерево обратно и обновите рабочее дерево так, чтобы оно совпадало с тем, как если бы мы делали извлечение или ускоренное слияние ".


edit: для максимального удобства вы можете вместо этого

find -name \*.txt -execdir rename .txt .md {} +
git add -A .

, который также выберет любые другие изменения, которые могут быть у вас в рабочем дереве; это менее "безопасно", вы можете не захотеть добавлять какие-либо другие изменения, или ваш .gitignore может быть еще не так хорошо настроен, но если ваша сборка чистая, это, скорее всего, сэкономит больше времени на печатание, чем стоит в make-Git- время на всеобщее обозрение.

2 голосов
/ 23 мая 2019

Git не поддерживает это из коробки, но вы можете использовать функции вашей оболочки для выполнения задачи:

for file in *.txt; do
  git mv "$file" "${file%.txt}.md";
done

${file%.txt}.md развернет переменную file, уберет ее .txtрасширение и затем добавьте .md после его значения.

0 голосов
/ 24 мая 2019

Git не имеет встроенной операции «пакетного переименования», но это не имеет значения: вы можете выполнить пакетное переименование, как вам нравится, затем git add новые имена и git add -u, чтобы забрать удаление (все ) старые имена или просто git add старые имена по отдельности. То есть:

$ git mv old new

имеет точно такой же эффект, как:

$ mv old new
$ git add old new

Чтобы продемонстрировать, я фактически выполнил две вышеупомянутые команды во временном тестовом репозитории, и теперь я запускаю git status:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    old -> new

ответ Книттла , конечно, хорошо, но я также хотел бы показать, как я склонен выполнять задачи сам:

$ echo *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/'
git mv a.txt b.txt a.txt b.md

Упс, это было неправильно, мне нужно одно имя файла на строку ... давайте попробуем это:

$ printf %s\\n *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/'
git mv a.txt a.md
git mv b.txt b.md

Вот, что я хотел, теперь, чтобы действительно это сделать, наберите control-P и добавьте | sh:

$ printf %s\\n *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/' | sh

Другими словами, мне нравится писать однострочный сценарий для генерации команд, которые должны быть запущены, а затем повторно запускать однострочный сценарий с выводом, перенаправленным в канал sh для их запуска. Если однострочный сценарий помогает мне, но в некоторых случаях требуется ручная настройка, я заменяю | sh на > /tmp/doit.sh, а затем редактирую сценарий /tmp/doit.sh, чтобы выполнить ручную настройку.

0 голосов
/ 23 мая 2019

Изменение расширения файлов

Если у вас много файлов с определенным расширением, и вы хотите изменить его на другое совместимое расширение, вы можете использовать следующую команду:

ren *.ext1 *.ext2

Синтаксис команды пример :

ren *.txt *.md

Пример синтаксиса команды изменяет расширение файла .txt на формат .md всех файлов в папке.

Переименование файлов с определенным расширением файла

ren nyc_*.* newYork_*.*

, указанная выше, переименует все файлы в папке.Если вы хотите переименовать только файлы изображений с расширением .jpg, вы можете использовать следующую команду:

 ren nyc_*.jpg newYork_*.jpg.

Переименование нескольких файлов

Чтобы переименовать несколько файлов,используйте синтаксис этой команды:

ren *.ext1 ???-new_filename_part.*

Пример синтаксиса команды:

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