여러 개의 로그 파일이 포함된 디렉터리가 있습니다. 이 같은:
data170213.log
data170214.log
data170215.log
data170216.log
최신 파일의 마지막 항목을 보고 추적하고 싶습니다. 최신 파일이데이터170216.log, 나는 이것을 할 수 있다
tail -f data170216.log
문제는 디렉토리에 있는 최신 파일의 이름이 무엇인지 모른다는 것입니다. 나는 그것을 식별할 수 있다
ls -1r *.log | head -1
명령 결과를 어떻게 보내는지 모르겠습니다.ls -1r *.log | ls -1r *.log |헤드-1명령하다꼬리 -f [파일]
나는 성공하지 않고 다음을 시도했습니다.
tail -f < ls -1r *.log | head -1
답변1
사용하다명령 대체:
tail -f "$(ls -1r *.log | head -n 1)"
이는 ls -1r *.log | head -n 1
서브셸에서 실행되고 출력을 가져와서 새 명령을 작성하는 데 사용됩니다. 따라서 ls
출력이 파이프 되면 data170216.log
명령은 다음과 같습니다.
tail -f "data170216.log"
그게 당신이 원하는 것입니다.
head -n 1
대신에 후자 head -1
의 형식은 더 이상 사용되지 않습니다.
답변2
xargs
이 경우에 사용할 수 있습니다 . 간단하고 쉬운 것은 다음과 같습니다.
$ ls -1r *.log | sed -n 1p | xargs tail -f
또는:
$ ls -1r *.log | head -1 | xargs tail -f
둘 다 잘 작동합니다.
바라보다man xargs
예:
/tmp 디렉터리에서 core라는 파일을 찾아 삭제합니다. 파일 이름에 줄 바꿈이나 공백이 포함되어 있으면 올바르게 작동하지 않습니다.
find /tmp -name core -type f -print | xargs /bin/rm -f
/tmp 디렉토리 안이나 그 아래에서 core라는 파일을 찾아 삭제합니다. 이때 공백이나 개행 문자가 포함된 파일 또는 디렉토리 이름을 올바르게 처리하는 방식으로 파일 이름을 처리합니다.
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
/tmp 디렉토리 안이나 그 아래에서 core라는 파일을 찾아 삭제합니다. 이때 공백이나 개행 문자가 포함된 파일 또는 디렉토리 이름을 올바르게 처리하는 방식으로 파일 이름을 처리합니다.
find /tmp -depth -name core -type f -delete
/tmp 디렉토리 안이나 그 아래에서 core라는 파일을 찾아서 삭제하세요. 하지만 이전 예제보다 더 효율적입니다(rm을 시작하기 위해 fork(2) 및 exec(2)를 사용하지 않고 추가 xargs 프로세스가 필요하지 않기 때문입니다)
시스템의 모든 사용자에 대한 간략한 목록을 생성합니다.
cut -d: -f1 < /etc/passwd | sort | xargs echo
xargs의 표준 입력에 나열된 파일을 편집하는 데 필요한 Emacs의 최소 복사본 수를 차례로 시작합니다. 이 예는 BSD의 -o 옵션과 동일한 효과를 달성하지만 더 유연하고 이식 가능한 방식입니다.
xargs sh -c 'emacs "$@" < /dev/tty' emacs