여러 파일의 xargs 출력을 하나의 파일로 저장

여러 파일의 xargs 출력을 하나의 파일로 저장

다음 세 가지 텍스트 파일이 있습니다.

#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 확장에는 기본적으로 숨겨진 파일이 포함되지 않기 때문입니다.*txtls

(최근 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
  • --옵션의 끝을 표시하므로 또는로 시작하는 파일 이름은 -옵션으로 간주되지 않습니다.lscat

또는 모든 시스템에서 bash 대신 zsh를 사용하십시오.

set -o extendedglob
cat -- (^all.)txt(-.om[1,3]) > all.txt

어디:

  • ^xzsh는 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)

관련 정보