find 명령에 인수를 전달하려고 할 때 문제가 발생합니까?

find 명령에 인수를 전달하려고 할 때 문제가 발생합니까?

범위:

export exc_lst='! -path  "/var/app/s2/pnl/incoming/recondata/*.*"';

다음 find 명령을 사용하려고 하면:

find $FILE_DIR -name "*.*"  "${exc_lst}" -type f -mtime +20 -user sh79790 -ls

오류가 발생합니다. 연결 누락

find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

언급된 경로는 제외되지 않습니다.

값을 직접 전달하면 제대로 작동합니다.

find $FILE_DIR -name "*.*" ! -path  "/var/app/s2/pnl/incoming/recondata/*.*" -type f -mtime +20 -user sh79790 -ls

find 명령에서 제외할 모든 파일을 포함할 변수를 구문 분석해야 합니다.

답변1

인용 문제가 있습니다.

팁: 명령줄 앞에 붙여넣어 echo실제로 확장되는 내용을 확인하세요. 보다 구체적으로 각 인수가 구분된 위치를 정확하게 표시하려면 python -c "import sys; print sys.argv[1:]"명령줄 앞에 붙여넣습니다.

python -c "import sys; print sys.argv[1:]" \
    find $FILE_DIR -name "*.*"  "${exc_lst}" -type f -mtime +20 -user sh79790 -ls

산출:

['find', '-name', '*.*', '! -path  "/var/app/s2/pnl/incoming/recondata/*.*"', '-type', 'f', '-mtime', '+20', '-user', 'sh79790', '-ls']

보시다시피 ! -path "/var/app/s2/pnl/incoming/recondata/*.*"공백과 따옴표가 포함된 하나의 큰 매개변수로 제공됩니다. 인용할 때 요구하는 사항은 다음과 같습니다 ${exc_lst}". 확장하지 마세요. find이것을 인식하지 마십시오. !, -path및 path 는 모두 별도의 매개변수로 사용됩니다 .

지금:

echo find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

산출:

find -name *.* ! -path "/var/app/s2/pnl/incoming/recondata/*.*" -type f -mtime +20 -user sh79790 -ls

보시다시피, 경로 이름 주위에는 문자 그대로 큰따옴표 문자가 있습니다. 실제로 이러한 따옴표가 포함된 경로는 제외되지만 이는 발생하지 않습니다.

exc_lst다음 인용문 없이 정의 해 보세요 .

export exc_lst='! -path  /var/app/s2/pnl/incoming/recondata/*.*'

그런 다음 두 번째 형식을 사용합니다.

find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

다행히 제외할 경로에는 공백이 포함되어 있지 않습니다. 그렇다면 이를 달성하기 어려울 것입니다.

참고: 내 모든 예제 출력에는 첫 번째 매개변수 가 내 셸 find에 정의되어 있지 않기 때문에 $FILE_DIR(해당 값을 지정하지 않았음) 누락되어 있지만 정의된 경우 해당 매개변수가 있을 것입니다.

답변2

exec_lst수행 방법을 정의하는 동시에 쉘이 파일 이름을 확장하는 것을 방지할 수는 없습니다 .

-path해당 매개변수는 별도의 매개변수에 있어야 합니다.

따라서 명령줄에서 직접 `-path*를 사용하고 경로를 쉘 변수에 넣는 것이 좋습니다.

또 다른 접근 방식은 $[exed_lst] 주위의 "를 생략하고 변수 할당의 각 별표 앞에 백슬래시를 1~2개 추가하는 것입니다.

관련 정보