bash: "$()"를 사용하여 "find"의 출력을 변수에 넣으려고 하지만 작동하지 않습니다.

bash: "$()"를 사용하여 "find"의 출력을 변수에 넣으려고 하지만 작동하지 않습니다.

내 스크립트의 목적은 사용자 입력에 의해 제공된 값을 기반으로 마지막 하위 디렉터리의 전체 경로를 제공하는 것입니다. 예를 들어 다음 스크립트는 다음과 같습니다.

./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-1234dir 아래에 남아 있는 모든 디렉터리입니다. 그러나 다음과 같은 결과가 나타납니다.

./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}')

관련 정보