Мое исходное дерево содержит несколько каталогов, которые используют управление исходным кодом Мерзавца, и мне нужно к tarball целое дерево, исключая любые ссылки на метаданные Мерзавца или пользовательские файлы журнала.
Я думал, что буду делать попытку с помощью комбинации find/egrep/xargs/tar, но так или иначе файл tar содержит .git каталоги и *.log файлы.
Это - то, что я имею:
find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar
Кто-то может объяснить мое недоразумение здесь? Почему tar обрабатывает файлы, которые находят, и egrep фильтруют?
Я открыт для других методов также.
Вы получите неприятный сюрприз, когда количество файлов увеличится до более чем одной команды xargs: тогда вы сначала создадите tar-файл из первых файлов, а затем перезапишете тот же tar-файл с остальные файлы.
GNU tar имеет параметр --exclude, который решает эту проблему:
tar cvf ~/app.tar --exclude .git --exclude "*.log" .
Попробуйте что-то вроде этого:
git archive --format=tar -o ~/tarball.tar -v HEAD
Добавьте файлы .log и все остальное, что вы не хотите упаковывать, в файл .gitignore.
[пощечина] Ба! Параметры, которые нужно было найти, были в неправильном порядке! Предупреждений я не видел, потому что они свистели с экрана. Это позволило '.' пройти через egrep, из-за которого смола все проглотила.
Это научит меня заглушать важные сообщения при подробной отладке.
Это работает:
find . -type f | egrep -v '\.git|\.log' | xargs tar cvf ~/app.tar
Вы можете сделать это без grep. найти мощный
find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...