Как скормить список файлов в скрипт bash - PullRequest
0 голосов
/ 07 ноября 2019

У меня проблемы с подачей большого списка имен файлов в команду в (git для windows git, я думаю, это cygwin) оболочка bash.

Это базовая команда, которая отлично работает с небольшим наборомаргументов: git filter-branch -f --tree-filter 'rm -rf file1 directory2 file3 file4' Однако у меня около 1500 имен файлов.

Я пробовал: git filter-branch -f --tree-filter 'rm -rf file1 directory2... all 1500 names here', но я получаю сообщение об ошибке:

/ mingw64 / bin / git:Слишком длинный список аргументов

Я пытался использовать цикл for: git filter-branch -f --tree-filter 'for f in $(cat files.txt) ; do rm -fr "$f" ; done', и он проходит через цикл с ошибкой:

cat: files.txt: Нет такого файла или каталога

К вашему сведению - содержимое файла files.txt выглядит следующим образом:

./file1 
./directory2 
./file3 
./file4

Затем я попытался: git filter-branch -f --tree-filter < cat files.txt и cat files.txt | git filter-branch -f --tree-filter, но я получаю ошибкио неправильном синтаксисе - он показывает диалог «помощь». Например:

использование: git filter-branch [--setup] [--subdirectory-filter] [--env-filter] [--tree-filter] [--index-filter][--parent-filter] [--msg-filter] [--commit-filter] [--tag-name-filter] [--original] [-d] [-f |--force] [--state-branch] [-] [...]

Тогда я подумал, может быть, я мог бы просто добавить аргументы в файл следующим образом: git filter-branch -f

Файл:

--tree-filter './file1 ./directory2 ./file3 ./file4'

Но я снова получаю диалог помощи.

Я уверен, что есть способ сделать это, но мой unix-fu слишкомслабый. Пожалуйста помоги!


В ответ на @ dash-o:

Я пробовал это, но получаю ошибку:

C: / Program Files / Git /mingw64 / libexec / git-core \ git-filter-branch: eval: строка 414: неожиданный EOF при поиске соответствия `'' C: / Program Files / Git / mingw64 / libexec / git-core \ git-filter-branch:eval: строка 415: синтаксическая ошибка: неожиданный конец файла

В файле files.txt перечислены файлы по одному на строку. Однако, rm -rf требует, чтобы они были в одной строке и были разделены пробелом.

Я пытался поместить имена файлов в одну строку, но я получаю другую ошибку:

C: / Program Files / Git / mingw64 / libexec / git-core \git-filter-branch: line 414: rm -rf .vs ./file1 ./directory2: команда не найдена. Фильтр дерева не выполнен: 'rm -rf ./file1 ./directory2'

Может бытьодиночные кавычки экранируются и не заключаются в команду rm?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

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

xargs -L50 < files.txt  | xargs -I@ git filter-branch -f --tree-filter "'rm -rf @'"

Первые xargs используются исключительно для организации блочных аргументов, 50 файлов. каждый. При необходимости это можно настроить, чтобы включить ограничение размера строки.

Второй xargs будет выполнять фильтр git для каждых 50 аргументов. Возможно, вам придется поработать над цитированием, так как у меня нет возможности проверить команду с помощью git на windows).

1 голос
/ 07 ноября 2019

Попробуйте, просто убедитесь, что вы находитесь в пути, где находится файл files.txt, чтобы избежать ошибки «Нет такого файла или каталога»:

for f in $(cat files.txt); do git filter-branch -f --tree-filter 'rm -rf '"$f"'' ; done
...