존재하지 않는 특정 파일을 포함하는 알 수 없는 디렉토리 이름을 추적하고 싶습니다. 예:
tail -F /tmp/*/app.log
그러나 와일드카드를 사용하면 의도한 대로 작동하지 않습니다. 해당 경로로 파일을 생성하는 경우 tail
명령을 다시 시작하지 않으면 다음 작업이 시작되지 않습니다. 반면에 다음을 실행하면:
tail -F /tmp/example/app.log
파일이 나타나면 즉시 명령이 출력됩니다.tail: '/tmp/example/app.log' has appeared; following new file
-f filename --retry
대신에 조합을 시도했지만 -F
결과는 동일합니다.
이 문제는 어떻게 해결될 수 있으며 동일한 목표를 달성할 수 있는 다른 방법이 있습니까?
답변1
/tmp/*/app.log
쉘에 의해 확장될 것입니다(BASH라고 가정합니다). 일치하는 항목이 있으면 해당 일치 항목으로 확장된 다음 인수로 전달됩니다.tail
$ find /tmp/test -type f
/tmp/test/a/app.log
/tmp/test/b/app.log
$ echo /tmp/test/*/app.log
/tmp/test/a/app.log /tmp/test/b/app.log
따라서 위의 경우 in 및 in을 tail
구체적으로 따르도록 구성됩니다 . 시작 당시 존재 하지 않았다면 따르지 않았을 것입니다. 새로운 디렉터리나 파일이 생성되면 이를 따르지 않습니다.app.log
a
app.log
b
app.log
b
일치하는 항목이 없으면 확장되지 않은 문자열이 인수로 전달됩니다.tail
$ echo /tmp/test/*/app2.log
/tmp/test/*/app2.log
따라서 절대 존재하지 않을 리터럴 pathname/filename 을 따르려고 시도합니다 (또는 존재하더라도 디렉토리 이름을 갖는 것은 일반적인 상황에서 권장할 만한 작업이 아니기 /tmp/test/*/app2.log
때문에 매우 이상한 방식으로 생성되었습니다 ). *
.