파일 이름의 시간 필드 문제

파일 이름의 시간 필드 문제
cd /u01/saddy | printf '%s\n' "XYZ.ABC.V.$(date -d '2020-06-14 +1 day' +%Y%m%d)"*.batch ;

putty경로를 통해 위 명령을 실행하면 /u01/saddy명령이 제대로 실행되고 예상되는 출력이 제공됩니다.

XYZ.ABC.V.20200615180200.batch

하지만 집 위치에서 명령을 실행하려고 하면 명령이 다음과 같이 출력을 반환합니다.

XYZ.ABC.V.20200615*.batch

위치에 있는 파일은 /u01/saddy다음과 같습니다.

XYZ.ABC.V.20200615180200.batch,
XYZ.ABC.V.20200616190100.batch,
XYZ.ABC.V.20200617140200.batch.

답변1

cmd1 | cmd2

두 개의 서로 다른 프로세스에서 동시에 실행되고 cmd1출력 cmd2cmd1입력으로 파이프됩니다.cmd2

그래서:

cd /some/dir | printf '%s\n' some-glob

별 의미가 없습니다. 이는 다른 프로세스에서 일부 glob의 확장을 인쇄하는 동안 일부 (임시) 프로세스의 현재 작업 디렉터리를 변경합니다.

cd의 출력을 으로 보내지 printfcd처음에는 아무 것도 인쇄하지 않으며, printf입력은 어쨌든 읽혀지지 않습니다.

아마도 당신은 다음을 의미할 것입니다:

cd /some/dir && printf '%s\n' some-glob

즉, 쉘의 작업 디렉토리를 변경한 다음 cd성공하면 glob의 확장을 인쇄합니다.

또는 ( cd별도의 프로세스에서 수행되고 printf현재 디렉터리를 변경한 후 동일한 프로세스에서 호출되는 경우):

(cd /some/dir && printf '%s\n' some-glob)

( (...)서브쉘 환경은 일반적으로 서브쉘 프로세스를 포크하여 시작되며, 환경에 대한 변경 사항은 cd내부 변경 범위로 제한됩니다 (...).)


또는소켓 쌍껍질이 좀 있어요

² 표준 출력에서 ​​무언가를 인쇄할 수 있는 유일한 경우는 설정할 때(또는 / 일부 쉘을 사용하여) 또는 슬래시 없이 -인수로 전달할 때입니다.-<n>+<n>$CDPATH

답변2

"홈 위치"에 파일 내용을 표시하지 않았지만 패턴과 일치하는 파일이 포함되어 있지 않은 것 같습니다.

XYZ.ABC.V.날짜 시간. 일괄

그러나 이 경우 *쉘은 글로브를 확장하지 않고 대신문자 그대로당신의 명령을 따르십시오 printf. 이것이 바로 설명하는 출력 문자열을 얻는 이유입니다.

이를 피하고 싶다면 설정을 시도해 보세요.

shopt -s nullglob

그런 다음 a를 포함하는 표현식이 일치하는 항목이 없으면 리터럴을 *포함하는 대신 빈 문자열로 확장됩니다 .*

cd그러나 동작을 통해 명령이 아무런 효과도 없는 방식으로 사용되는 것을 확인했습니다 . 더 자세히 설명하고 싶을 수도 있습니다.무엇명령을 사용하여 수행하려고 하면 기여자가 더 나은 솔루션을 찾는 데 도움을 줄 수 있습니다( |예를 들어 를 사용하는 이유에 대한 질문은 이미논평).

관련 정보