bash 변수로 파일 목록을 zcat에 전달하는 방법은 무엇입니까?

bash 변수로 파일 목록을 zcat에 전달하는 방법은 무엇입니까?

zcat단일 출력 스트림을 bash 파이프라인에 전달하려고 합니다 . wc -l이 예제에서는 이를 파이프라인 으로 사용해 보겠습니다 .

zcat -f /var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log | wc -l

실제로 반환되는 것은 행 수입니다.

paths="/var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log"
zcat -f "${paths}" | wc -l

gzip: /var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log.gz: 해당 파일이나 디렉터리가 없습니다.

내 파이프라인이 중간 파일 없이 한 번의 패스만 만들 수 있도록 이러한 모든 파일을 stdout에 병합하려면 어떻게 해야 합니까? .gz변수에 추가된 전체 문자열 결과를 단일 매개변수인 것처럼 전달해 보았습니다.

답변1

var=('first value' 'second value'...)목록은 의 구문을 사용하여 할당됩니다 bash.

paths=(/var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log)
zcat -f -- "${paths[@]}" | wc -l

of에는 파일 이름 인수가 전달되지 않으면 출력이 전혀 생성되지 않고 표준 입력이 읽히는 $path빈 목록이 포함되어 있습니다 zcat -f -- "${paths[@]}".zcat -f --zcat

이 문제를 해결하려면 다음을 수행할 수 있습니다.

{ (( ${#paths[@]} == 0 )) || zcat -f -- "${paths[@]}"; } | wc -l

또는:

zcat -f -- </dev/null "${paths[@]}" | wc -l

/var/log/log*파일을 역순으로 연결 하려면 다음 zsh보다 셸을 사용하는 것이 좋습니다 bash.

zcat -f /var/log/log*(nOn) | wc -l

(이것은 ame의 n숫자 order( O역대문자 사용) 입니다 n.)

일치하는 파일이 없으면 위의 해결 방법은 필요하지 않습니다.

$ zcat -f /var/log/log*(nOn) | wc -l
zsh: no matches found: /var/log/log*(nOn)
0

답변2

따옴표가 없는 변수는 셸이 토큰화 및 파일 이름 생성을 수행하도록 합니다. 첫 번째 효과만 원하므로 후자를 비활성화할 수 있습니다.

paths="/var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log"
(
  set -f
  zcat -f $paths | wc -l   # variable is unquoted
)

설정이 해당 하위 쉘의 수명 동안에만 유효하도록 괄호를 추가했습니다.

분명히 쉘이 토큰화되도록 허용한다는 것은 경로 이름에 공백이 포함되어 있으면 쉘이 손상된다는 것을 의미합니다.

관련 정보