"cut"/"find"의 출력을 "scp"로 리디렉션하고 일부 변환을 적용하는 bash 스크립트

"cut"/"find"의 출력을 "scp"로 리디렉션하고 일부 변환을 적용하는 bash 스크립트

/ 의 cut출력을 리디렉션 하고 그 사이에 파일 이름 변환을 적용해야 합니다 .findscp

배경:

버전 관리를 위해 투명 케이스를 사용하고 있습니다. feature브랜치 에 있는 모든 파일 과 원본 버전을 다른 컴퓨터로 전송 /Main하고 싶습니다 .scpfeature/Main

나는 지점에서 변경한 파일을 나열하는 명령을 알고 feature있으며 원본도 얻을 수 있습니다.

내가 시도한 것은 다음과 같습니다.

filefinder지점의 파일을 나열하기 위해 별칭을 만들었습니다 .

find이는 분기의 모든 파일을 찾는 데 사용됩니다 feature.

$ filefinder `feature` | cut -d '/' -f 2 -

a.c

b.c

c.h

d.h

예를 들어 내가 시도하면

$ scp $(filefinder KERN_414_A64 | cut -d '/' -f 2) test@ip:/path/

scp지점 의 모든 파일을 가져올 수 있습니다 feature.

필요하다:

/main/latest파일의 버전을 얻으려면 . 파일 이름을 다음으로 변경해야했습니다.

a.c@@/Main

b.c@@/Main

c.h@@/Main

그런 다음scp 그것들문서. 따라서 기본적으로 find/command의 출력을 편집하기 전에 cut편집하십시오 .scp

아무것도 작동하지 않으면 분기를 로 변경할 수 있지만 /Main/latest더 나은 방법을 찾으려고 노력합니다.

어떤 조언이라도 도움이 될 것입니다.

고쳐 쓰다

filefinder별명:

cleartool find . -type f -branch "brtype($1)" -print | awk -F"@" '{print $1}'

감사해요!

답변1

구체적인 정의가 없으면 filefinder다음과 같다고 가정하겠습니다(그러나 아래 업데이트 참조).

filefinder() { find "$1" -type f; }

이런 이름의 파일을 많이 복사하고 계시다면 조금 걱정이 됩니다.

a.c@@/Main
b.c@@/Main
c.h@@/Main

이름이 지정된 대상이 생성됩니다 . 따라서 대상은 다음과 같이 유지되어야 한다고 Main가정합니다 .a.c@@/Maina.c

filefinder이제 파일을 사용하는 대신 한 번의 작업으로 파일을 복사할 수 있습니다. filefinder(위)와 같이 매개변수화할 수 있도록 이 솔루션을 구축했습니다 .

filecopier() {
    find "$1" -type f -exec bash -c '
        for file in "$@"
        do
            file="${file#*/}"
            echo scp -p "${file}@@/Main" test@ip:"/path/${file##*/}"
        done
    ' _ {} +
}

명령이 정확하다고 생각되면 삭제하십시오 echo.scp


filefinder그래서 생각보다 간단하지 않은 것 같아요 . 그럼에도 불구하고 우리는 여전히 다음과 같은 것을 사용할 수 있습니다

filefinder ... |
    while IFS= read -r file
    do
        echo scp -p "${file}@@/Main" test@ip:"/path/${file##*/}"
    done

이는 파일 이름이 줄 바꿈과 같은 어색한 문자 없이 한 줄에 하나씩 있다고 가정합니다.

관련 정보