한 명령의 출력을 다른 명령으로 파이프하려고 합니다.
ls -lt *.txt | tail -n 3 | cat
.txt
모든 파일을 나열하고 마지막 2개 파일을 가져온 다음 를 사용하여 해당 내용을 표시하고 싶지만 cat
이는 올바른 방법이 아닙니다. 이 목표를 어떻게 달성할 수 있나요? 나는 언급했다https://unix.stackexchange.com/a/108797/431721를 사용해 보았지만 cat $( ls -lt *.txt | tail -n 3)
작동하지 않습니다. 어떤 충고?
답변1
가능한 모든 파일 이름(줄 바꿈이 있는 파일 이름 포함)을 올바르게 처리하기 위해 다음 명령은 cat
셸을 사용하여 가장 최근에 수정된 두 파일을 호출하고 가장 오래된 파일을 마지막으로 처리합니다 zsh
.
cat ./*.txt(.om[-2,-1])
다음은 최근에 수정된 두 개의 파일입니다 cat
. 가장 최근에 수정된 파일을 먼저 처리합니다.
cat ./*.txt(.om[1,2])
여기서 와일드카드 패턴 은 다음과 (.om[1,2])
같습니다 ../*.txt
글로벌 예선. .
한정자에서는 패턴이 일반 파일(디렉토리 등이 아닌)에만 일치하도록 만듭니다. om
수정 타임스탬프를 기준으로 파일을 정렬합니다( Om
순서는 반대입니다). 결과 목록의 처음 두 요소 만 [1,2]
선택됩니다. 여기서 음수 인덱스는 목록 끝부터 계산됩니다.
셸에서 다른 유틸리티처럼 bash
사용하세요 .zsh
zsh -c 'cat ./*.txt(.om[-2,-1])'
그리고
zsh -c 'cat ./*.txt(.om[1,2])'
각기.
답변2
한 번에 한 단계씩 진행하세요.
$ ls -lt *.txt
-rw-r--r-- 1 stew stew 18 Feb 5 19:53 file3.txt
-rw-r--r-- 1 stew stew 18 Feb 5 19:53 file2.txt
-rw-r--r-- 1 stew stew 18 Feb 5 19:53 file1.txt
세 개의 파일이 있는데 두 개만 원합니다. 해보자 tail
:
$ ls -lt *.txt | tail -n 2
-rw-r--r-- 1 stew stew 18 Feb 5 19:53 file2.txt
-rw-r--r-- 1 stew stew 18 Feb 5 19:53 file1.txt
좋아요, 좋습니다. 하지만 실제로는 파일 이름이 두 개만 필요합니다. ls -l
올바른 도구가 아닌 경우 다음을 사용할 수 있습니다 ls
.
$ ls -t *.txt | tail -n 2
file2.txt
file1.txt
cat
그런 다음 해당 출력을 매개변수로 입력합니다 $()
.
$ cat $(ls -t *.txt | tail -n 2)
content of file 2
content of file 1
별칭을 사용하는 방법을 물으셨습니다 ls -lthr
. -l
파일 이름 이상의 내용을 인쇄하기 때문에 잘 작동하지 않습니다. 존재만이 -h
의미가 있다. -l
예는 다음과 같습니다 ls -tr
.
$ alias lt='ls -tr'
$ cat $(lt *.txt | tail -n 2)
content of file 2
content of file 3
.bashrc
마음에 드는 것이 있으면 또는 를 alias ls='ls -lthr'
사용할 수 있습니다 . 파일의 이상한 문자(예: 개행 문자)를 처리하기 위한 다른 방법을 원하는 경우 다음 예를 사용하세요 .command ls
env ls
find
cat $(find . -name '*.txt' | tail -n 2)
그러나 정렬 방식은 솔루션과 다를 수 ls
있으며 하위 디렉터리도 검색합니다.
답변3
GNU coreutils ls가 있는 한:
eval "sorted=( $(ls -rt --quoting-style=shell-escape *.txt) )"
cat "${sorted[@]:0:3}"
이는 이상적인 솔루션은 아니지만 현재 디렉터리에 txt 파일을 포함하는 배열을 생성하고 수정 시간별로 정렬한 다음 상위 3개를 정렬합니다.
답변4
다음 명령을 한 줄에 실행하기만 하면 됩니다.
$ ls *.txt | tail -2 | xargs cat
설명하다:
세 가지 테스트 파일을 만듭니다.
tc@user1:~$ echo "first file reads 1" > file1.txt
tc@user1:~$ echo "second file reads 2" > file2.txt
tc@user1:~$ echo "third file reads 3" > file3.txt
파일이 생성되었는지 확인합니다.
tc@user1:~$ ls -l
total 12
-rw-r--r-- 1 tc staff 19 Feb 5 18:58 file1.txt
-rw-r--r-- 1 tc staff 20 Feb 5 18:58 file2.txt
-rw-r--r-- 1 tc staff 19 Feb 5 18:58 file3.txt
모든 텍스트 파일을 나열한 다음 파이프를 사용하여 마지막 두 파일의 내용을 읽습니다.
tc@user1:~$ ls *.txt | tail -2 | xargs cat
second file reads 2
third file reads 3