꼬리에 대한 ls의 파이프 결과

꼬리에 대한 ls의 파이프 결과

여러 개의 로그 파일이 포함된 디렉터리가 있습니다. 이 같은:

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

관련 정보