cat 디렉토리의 마지막 5개 파일

cat 디렉토리의 마지막 5개 파일

$date.txt 형식의 파일 이름을 가진 디렉터리가 있습니다. 나는 그것에서 5개의 최신 파일을 분류하고 싶습니다. 그보다 더 우아한 해결책이 있습니까?

for f in 2*.txt; do echo $f; done | tail -5 | while read f; do cat $f; done

답변1

ksh93, 또는 :bashzsh

files=( 2*.txt )
cat "${files[@]: -5}"

그러면 패턴과 일치하는 파일 이름의 배열이 생성됩니다 2*.txt. 그런 다음 이들 중 마지막 5개의 내용을 출력합니다.

에서는 zsh해당 작업의 일부로 파일 범위를 지정할 수도 있습니다.글로벌 한정자:

cat 2*.txt([-5,-1])

모든 POSIX 셸에서 이 작업은 다음을 통해 수행될 수도 있습니다.

set -- 2*.txt
while [ "$#" -gt 5 ]; do shift; done   # or: [ "$#" -gt 5 ] && shift "$(( $# - 5 ))"
cat "$@"

그러면 위치 매개변수가 패턴과 일치하는 파일 이름으로 설정됩니다. 그런 다음 목록에 5개의 요소만 포함될 때까지 목록의 시작 부분에서 이름을 이동합니다. cat그런 다음 나머지 파일 이름에 대해 호출됩니다.

이러한 모든 솔루션에서 파일은 사전순으로 정렬됩니다. 공백이나 줄바꿈이 포함된 파일 이름은 올바르게 처리됩니다.

답변2

while read 루프를 사용하면 공백이 있는 파일을 처리할 수 있습니다.

ls 2*.txt | tail -5 | while read loop
do
  cat "$loop" 
done 

항상 가장 최근의 5개를 원하면 다음과 같이 변경할 수 있습니다.ls -tr | tail -5

답변3

질문에 따르면 공백이 없을 가능성이 있고 2*.txt가 올바른 순서를 행복하게 반환하는 경우는 어떻습니까?

cat $(ls 2*.txt|tail -5)

답변4

문제에서 언급했듯이 latest디렉토리에 있는 파일의 수정 시간을 통해 확인할 수 있습니다.

 cat $(ls -ltr *.txt | tail -n5 | awk '{print $NF}' | tr '\n' ' ')
  • ls -ltr- 수정 타임스탬프와 관련된 파일을 나열합니다(역방향).

  • tail -n5- 마지막 5개 파일을 가져옵니다.

  • $NF- 마지막 필드

  • tr- 열을 행으로 바꾸기

관련 정보