다음 세 가지 텍스트 파일이 있습니다.
#1.txt
hey stackoverflow
#2.txt
hey stackexchange
#3.txt
hello world
나는 이 명령을 사용하여 내 디렉토리의 마지막 3개 파일을 나열한 다음 cat
이를 나열하고 3개 파일의 모든 출력을 파일( all.txt
) 에 저장합니다.
주문하다:
ls -alth *txt | head -3 | xargs -n1 cat
출력을 파일로 리디렉션하려면 어떻게 해야 합니까?
답변1
-l
(긴 목록용) 옵션을 사용하는 것은 ls
여기서는 의미가 없습니다. 파일 이름만 필요하기 때문입니다( -h
(보고 크기에 대한 GNU 확장과 동일)인류형식)은 다음과 같습니다).
사용된 xargs
기본 분할 ls
도 올바르지 않습니다. 공백, 줄바꿈, 따옴표, 백슬래시 등이 포함된 파일 이름을 깨뜨릴 수 있기 때문입니다.
이 옵션을 사용하는 것도 의미가 없습니다. 쉘이 대신 -a
여기에서 glob을 확장하여 파일 목록을 계산하고 glob 확장에는 기본적으로 숨겨진 파일이 포함되지 않기 때문입니다.*txt
ls
(최근 GNU 시스템 및 GNU 쉘(bash)에서) 원하는 것은 다음과 같습니다.
shopt -s extglob
ls -Ltd --zero -- !(all.)txt | head -zn3 | xargs -r0 cat -- > all.txt
( dotglob
숨겨진 파일을 고려하려는 경우 이 옵션을 설정할 수도 있습니다).
다음에 추가:
-L
심볼릭 링크 유형의 파일에 대해ls
심볼릭 링크 대상의 수정 시간을 고려하는 옵션-d
왜냐하면 이러한 파일 중 일부가 다음 유형의 경우목차ls
, 내용을 나열하고 싶지 않습니다 .--zero
//NUL로 구분된 레코드를 처리합니다. NUL은 파일 경로에 나타날 수 없는 유일한 문자입니다-z
.-0
!(all.)txt
목록에 포함되지 않도록*txt
하는 대신 디스크가 가득 차는 무한 루프가 발생할 수 있습니다.all.txt
-r
파일을 찾을 수 없는 경우 실행을xargs
방지 하는 옵션입니다 .cat
--
옵션의 끝을 표시하므로 또는로 시작하는 파일 이름은-
옵션으로 간주되지 않습니다.ls
cat
또는 모든 시스템에서 bash 대신 zsh를 사용하십시오.
set -o extendedglob
cat -- (^all.)txt(-.om[1,3]) > all.txt
어디:
^x
zsh는 ksh와 동일합니다!(x)
(bash는 옵션을 통해 ksh의 확장된 glob 연산자의 하위 집합을 지원합니다extglob
).-
동등하다-L
.
제한된정기적인디렉터리, fifo, 장치를 제외한 파일(또는 일반 파일에 대한 심볼릭 링크)...om
-t
수정 시간을 기준으로 정렬하는 것과 동일합니다 .[1,3]
예를 들어head -zn3
처음 3개에 대한 제한이 있습니다.- glob이 어떤 파일과도 일치하지 않으면 명령이 실행되지 않고 오류가 반환됩니다(위의 bash 명령은
all.txt
생성되거나 잘리지 않습니다).
파일을 숨긴 것으로 간주하려면 다음을 추가하십시오.D
글로벌 예선( cat -- (^all.)txt(D-.om[1,3]) > all.txt
)