bash는 스크립트에서 exec cp 상위를 찾습니다.

bash는 스크립트에서 exec cp 상위를 찾습니다.

이 명령을 실행하려고 합니다.

for c in ax
do
mkdir $TgtDir$c/$Date
cd $TgtDir$c/$DirNew
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo $DIR
echo find . -iname $tgt -exec cp --parents {} ../$Date \;
find . -iname $tgt -exec cp --parents {} ../$Date \;
done

그것은 인쇄한다

/home/ax/new
find . -iname '*20170829*' -exec cp --parents {} ../20170829 ;

그러나 아무것도 복사하지 않습니다. 새 디렉토리에서 여기에 echoed 명령을 실행하면(끝에 \를 추가한 후 echo가 이스케이프를 삼키는 것 같습니다) 제대로 작동하고 파일은 /home/ax/20170829/…에 복사됩니다.

내가 여기서 놓친 아이디어가 있습니까?

답변1

내 생각 엔 실제로는 서브쉘에서 실행 중인 DIR 디렉토리에 있지 않지만 cd나머지 명령에 대한 작업 디렉토리는 여전히 거기에 있습니다 $TgtDir$c/$DirNew.pwdecho $DIR

해결 방법: 직접 호출하고 cd, 서브쉘을 사용하거나 결과를 변수에 할당하지 마세요. 복사 명령에 절대 대상 경로를 추가합니다.

for c in ax
do
    mkdir $TgtDir$c/$Date

    DIR=$( dirname "${BASH_SOURCE[0]}" )
    cd "${DIR}"
    pwd

    find . -iname $tgt -exec cp --parents {} $TgtDir$c/$Date \;
done

대안: find 명령에서 "." 대신 소스 디렉토리를 사용하십시오.

for c in ax
do
    mkdir $TgtDir$c/$Date
    cd $TgtDir$c/$DirNew

    DIR=$( dirname "${BASH_SOURCE[0]}" )
    find "${DIR}" -iname $tgt -exec cp --parents {} ../$Date \;
done

참고: 코드는 테스트되지 않았습니다.

관련 정보