최고의 답변이 문제반복되는 공백을 기반으로 잘라내기 cut
위해 with 와 함께 사용할 수 있음 을 보여줍니다.tr
< file tr -s ' ' | cut -d ' ' -f 8
디렉터리에 있는 여러 Git 저장소의 원격 주소를 가져오고 다음을 사용하여 각 저장소에서 원격 URL 필드를 추출하려고 합니다.
ls | xargs -I{} git -C {} remote -vv | sed -n 'p;n' | tr -s " " | cut -d ' ' -f1
그러나 이로 인해 다음과 같은 출력이 발생합니다. 여기서 두 개의 연속 공백(유니코드 코드 포인트 32)이 보존되는 것을 볼 수 있습니다.
origin https://github.com/jik876/hifi-gan.git
origin https://github.com/NVIDIA/NeMo.git
origin https://github.com/NVIDIA/tacotron2.git
(나도 사용해 xargs
봤음 tr
)
원하는 출력은 URL 목록입니다. 예를 들면 다음과 같습니다.
https://github.com/jik876/hifi-gan.git
https://github.com/NVIDIA/NeMo.git
https://github.com/NVIDIA/tacotron2.git
내가 여기서 무엇을 놓치고 있는 걸까요?
답변1
두 개의 공백이 아니라 탭입니다.
쉘 루프를 사용하여 현재 작업 디렉토리에 디렉토리가 있는 하위 디렉토리를 반복한 다음 공백으로 구분된 첫 번째 필드를 .git
반복한 다음 ( 끝에 추가된 및 태그를 제거하기 위해) 각 원격 + URL에 전달할 수 있습니다. 한 줄만 표시하려면 다음을 수행하세요.cut
(fetch)
(push)
git
uniq
for r in ./*/.git/; do
git -C "$r" remote -v
done | cut -f 1 -d ' ' | uniq | cut -f 2
마지막 항목은 cut -f 2
탭으로 구분된 두 번째 필드를 반환하여 URL을 분리합니다.
탭과 공백이 동일하게 처리된다는 점을 고려하면 awk
(특정 구분 기호나 패턴을 사용하지 않는 한) 후행 파이프를 단일 호출로 바꿀 수 있습니다 awk
.
for r in ./*/.git/; do
git -C "$r" remote -v
done | awk '!seen[$2]++ { print $2 }'
답변2
bash
tr
bash와 함께 제공되는 모든 공백 cut
, xargs
토큰화 및 glob 문제를 처리하는 대신 작업에 더 적합한 언어를 사용하고 git 저장소와 상호 작용하기 위한 라이브러리 모듈을 포함할 수 있습니다. 예를 들어, Perl은 다음과 같이 제공됩니다.힘내::원시기준 치수.
이것은 매우 간단한 한 줄의 예입니다. (비록 Git::Raw
그보다 훨씬 더 많은 일을 한다는 점은 주목할 가치가 있으며, 모듈을 사용하는 독립형 Perl 스크립트를 작성하는 것이 더 나을 것입니다.)
읽기 쉽도록 줄바꿈과 들여쓰기를 추가했습니다. 있는 그대로 작동하거나 모두 한 줄로 압축되어 작동합니다.
$ perl -MGit::Raw -l -e '
foreach my $d (@ARGV) {
$d =~ s/\.git$//;
next unless -d "$d/.git";
my $repo = Git::Raw::Repository->open($d);
print $d;
foreach my $r ($repo->remotes()) {
print $r->url
};
print "";
}' */.git
영어로는 다음과 같습니다.
- 실제로 git 저장소가 아닌 디렉터리를 무시하고 명령줄에 나열된 각 저장소를 엽니다.
- 저장소의 원격을 반복하고 해당 URL을 인쇄합니다.
샘플 출력. 나는 때때로 github에서 다양한 저장소를 복제하는 데 사용하는 디렉토리에서 위의 줄을 실행했습니다. 해당 저장소에 속한 원격 목록 앞에 디렉터리 이름을 인쇄하고 각 디렉터리가 처리된 후에는 빈 줄을 인쇄하는 코드 줄을 작성했습니다.
mgetty
https://github.com/Distrotech/mgetty.git
roxterm
https://github.com/realh/roxterm.git
zpool-iostat-viz
https://github.com/chadmiller/zpool-iostat-viz.git
참고: Perl에는 포함되어 있지 않으며 배포 패키지와 함께 또는 배포 패키지를 통해 Git::Raw
설치해야 합니다 (예: Debian 등. 다른 배포판에도 있을 수 있음). 이 모듈은 Perl 래퍼입니다.cpan
apt-get install libgit-raw-perl
libgit2따라서 CPAN을 사용하여 수동으로 설치하려면 gcc
libgit2 개발 라이브러리와 헤더를 설치해야 합니다.
또한 주목할 만한 점은 Perl(또는 거의 모든 다른 언어)을 사용하지 않고도 Git::Raw
출력을 구문 분석하는 것이 git
bash보다 쉽고 오류 발생 가능성이 낮다는 것입니다. Perl은 문자열 일치 및 조작을 위해 특별히 설계되었으므로 Bash에서 수행하려는 작업은 Perl에서는 사소한 일입니다.
그런데 마음에 드신다면 python
확인해 보시는 것도 좋을 것 같습니다GitPython대신에. Debian 등에서는 를 사용하여 설치할 수 있으며 apt-get install python3-git
, 다른 배포판용으로 패키지되어 있을 수도 있습니다. 이것은 사용되지 않으며 bash에서 수행하려는 작업과 유사한 libgit2
명령 주위의 래퍼입니다 .git
어제 어쩐지 이걸 놓쳤는데 libgit2
웹사이트에서는 이렇게 말하더군요 피지트2Git::Raw
Perl에서와 마찬가지로 Python에서도 동일한 작업을 수행합니다(즉, C libgit2 라이브러리를 사용하므로 필요할 때 분기하는 것보다 빠르고 git
출력 구문 분석 문제의 위험을 방지합니다). 데비안 패키지는 이며 python3-pygit2
, 다른 배포판용으로도 패키지될 수 있습니다.