각 줄에서 명령을 실행할 때 출력을 리디렉션하는 루프 파일

각 줄에서 명령을 실행할 때 출력을 리디렉션하는 루프 파일

저는 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됩니다 .gitstatus

각 호출 전에 저장소 경로를 출력하려면 다음 스크립트를 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".

관련 정보