내 스크립트의 목적은 사용자 입력에 의해 제공된 값을 기반으로 마지막 하위 디렉터리의 전체 경로를 제공하는 것입니다. 예를 들어 다음 스크립트는 다음과 같습니다.
./script.sh TICKET-1234
출력은 다음과 같아야 합니다.
The full path is --> /share/data/TICKET-1234/some/other/sub/dir
다음 코드를 사용하여 이를 달성하려고 합니다.
rootPath="/share/data/"
anchorDir="${1}"
restOfPath=$(find /rootPath/$1/ -type d)
#fullPath=rootPath+anchorDir+restOfPath
echo "rest of path is $restofPath"
restOfPath
현재는 " "에 내가 기대하는 값이 할당되었는지 확인합니다 . 이는 TICKET-1234
dir 아래에 남아 있는 모든 디렉터리입니다. 그러나 다음과 같은 결과가 나타납니다.
./script.sh TICKET-1234
rest of path is /share/data/TICKET-1234/
/share/data/TICKET-1234/client
/share/data/TICKET-1234/client/region
/share/data/TICKET-1234/client/region/logs/
/share/data/TICKET-1234/client/region/logs/2019
출력(" ")에서 마지막 경로의 두 번째 부분만 캡처하여 변수 /client/region/logs/2019
에 할당하려면 어떻게 해야 합니까?$restOfPath
감사해요
답변1
오류 라인 3: $
앞에 RootPath가 없습니다.
답변2
권장 수정사항 적용 결과shellcheck.net당신의 스크립트에.
rootPath="/share/data/"
anchorDir="${1}"
restOfPath=$(find /rootPath/"$1"/ -type d)
#fullPath=rootPath+anchorDir+restOfPath
echo "rest of path is $restOfPath"
변경 사항을 적용하기 전에 다음 문제가 감지되었습니다.
Line 3:
rootPath="/share/data/"
^-- SC2034: rootPath appears unused. Verify use (or export if used externally).
Line 4:
anchorDir="${1}"
^-- SC2034: anchorDir appears unused. Verify use (or export if used externally).
Line 5:
restOfPath=$(find /rootPath/$1/ -type d)
^-- SC2034: restOfPath appears unused. Verify use (or export if used externally).
^-- SC2086: Double quote to prevent globbing and word splitting.
Did you mean: (apply this, apply all SC2086)
restOfPath=$(find /rootPath/"$1"/ -type d)
Line 7:
echo "rest of path is $restofPath"
^-- SC2154: restofPath is referenced but not assigned (did you mean 'restOfPath'?).
답변3
이 시도,
find /rootPath/$1/ -type d -printf '/%P\n'
/
/client
/client/region
/client/region/logs
/client/region/logs/2019
마지막 행만 필요한 경우
find /rootPath/$1/ -type d -printf '/%P\n' | tail -n1
/client/region/logs/2019
%P 파일 이름과 파일이 삭제된 것으로 발견된 지점의 이름입니다.
답변4
첫째, find 명령에 $
기호가 누락되었습니다. 가장 깊은 디렉토리만 얻으려면 다음과 같이 find를 사용할 수 있습니다.
restOfPath=$(find $rootPath/$1 -type d -links 2)
다음 방법을 시도해 볼 수도 있습니다(약간 이상하지만 작업이 완료됩니다).
restOfPath=$(find $rootPath/$1 -type d |awk '{lnew=gsub(/\//,"/",$0); if (lnew > l) {l=lnew p=$0}; } END {print p}')