저는 Linux에서 bash를 배우고 있습니다. "파일에서 읽는 동안 루프"에 대한 스크립트를 찾아서 아래와 같이 수정했습니다. 모든 git 저장소가 포함된 목록 파일을 읽으려고 하며 이 모든 git 저장소를 반복하고 git status
모두 실행하려고 합니다. 그들의:
while read line;
do echo $line;
cd $line;
git status;
done < repo.list
이 부분은 잘 작동하고 표준 출력에서 각 저장소의 상태를 볼 수 있지만 출력을 다른 파일에 쓰려고 하면 작동하지 않습니다.
while read line;
do echo $line;
cd $line;
git status;
done < repo.list
> status.txt
git status
모든 출력을 통합하여 파일에 쓰려면 어떻게 해야 합니까 ? 감사해요!
답변1
새 줄로 리디렉션할 때 빈 명령으로 작동하여 이 문제를 해결합니다 done
.
while IFS= read -r line;
do echo "$line"
(cd "$line"; git status)
done < repo.list > status.txt
당신은 또한 볼 수 있습니다IFS에 대해 알아보기그리고"IFS=read-r-line" 이해영향의 미묘함에 대한 정보와 관련된 문제를 연결합니다 read
.
cd
및 와 함께 서브쉘을 사용한다는 git status
것은 디렉토리를 변경해도 루프의 후속 반복이나 while
.
답변2
나는 그것을 구글링했고 이것이 mydir -name .git -type d라는 것을 발견했습니다.
다음과 같이 할 수 있습니다.
find . -name '.git' -type d -print -execdir git status \;
그러면 이름이 지정된 디렉터리를 찾은 .git
다음 각 디렉터리에 대해 해당 경로를 인쇄한 다음 포함된 디렉터리로 이동하여 git status
그곳에서 실행합니다. ( find -exec
명령은 원래 디렉터리에서 실행되어 -execdir
일치하는 파일/디렉터리 위치로 이동합니다.)
다음과 같이 출력됩니다.
./this-stuff/.git
On branch master
Your branch is up to date with 'origin/master'.
그리고 이를 후처리하려면 더 많은 기술이 필요합니다 .git
. (예를 들어 -exec sh -c 'echo "${1%.git}"' sh {} \;
. -print
)
일반적으로 말해서, find
당신이 뭔가를 하고 싶다면 그것이 효과가 있을 수 있습니다모두파일의 메타데이터에서 분명하게 나타나는 특정 조건과 일치하는 특정 하위 트리의 파일/디렉터리입니다. 그러나 기존 목록이 있는 경우 이를 처리하는 가장 좋은 방법은 셸 루프입니다.
답변3
귀하의 질문은 단순한 오타입니다.스티븐이미.
git status
파일의 줄에 지정된 각 디렉터리에서 작업을 실행하려면 다음을 xargs
사용하여 수행할 수도 있습니다.
xargs -I {} git -C {} status <repo.list >status.txt
이를 git -C {} status
위해서는 파일의 모든 행이 필요합니다 repo.list
. {}
파일에서 읽은 행으로 대체되며 옵션을 사용 하면 유틸리티가 현재 디렉토리 대신 하위 명령의 대체 디렉토리를 사용하게 -C
됩니다 .git
status
각 호출 전에 저장소 경로를 출력하려면 다음 스크립트를 git status
호출하십시오 .sh -c
xargs -I {} sh -c 'printf "REPOSITORY: %s\n" "$1"; git -C "$1" status' sh {} <repo.list >status.txt
스크립트 내에서 sh -c
저장소 경로 이름은 로 제공됩니다 "$1"
.