이 명령을 실행하려고 합니다.
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
.pwd
echo $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
참고: 코드는 테스트되지 않았습니다.