모든 숨겨진 파일을 연결하기 위해 tail을 올바르게 사용하는 방법

모든 숨겨진 파일을 연결하기 위해 tail을 올바르게 사용하는 방법

질문

나는 다음을 할 수 있기를 원합니다:

  1. 디렉터리(일반 및 숨김)의 모든 파일을 연결합니다.
  2. 하지만 각 연결이 시작될 때마다 각 파일의 제목을 표시하고 싶습니다.

매우 깔끔한 트릭으로 #2를 수행 할 수 있는 몇 가지 솔루션을 온라인에서 찾았 지만 여기 에는 tail -n +1 * 2>/dev/null내가 하려는 것과 같은 파일 숨기기가 포함되지 않습니다.cat * .* 2>/dev/nullhead * .* 2>/dev/null

cat 명령은 트릭을 수행하지만 파일 이름을 포함하지 않으며 head 명령은 각 파일의 전체 내용을 인쇄/연결하지 않습니다.

질문

내가 해야 할 일을 할 수 있는 방법이 있나요 tail?그렇지 않다면 동일한 결과/출력을 달성하는 좋은 대안은 무엇입니까?

예시 업데이트

모든 파일(일반 파일 및 숨김 파일)을 연결하려고 할 때 tail 명령


[kevin@PC-Fedora tmp]$ ls -la
total 8
drwx------   2 user user 4096 Jun 23 09:24 .
drwxr-xr-x. 54 user user 4096 Jun 23 08:21 ..
-rw-rw-r--   1 user user    0 Jun 23 09:24 .f1
-rw-rw-r--   1 user user    0 Jun 23 09:24 f1
-rw-rw-r--   1 user user    0 Jun 23 09:24 .f2
-rw-rw-r--   1 user user    0 Jun 23 09:24 f2
-rw-rw-r--   1 user user    0 Jun 23 09:24 .f3
-rw-rw-r--   1 user user    0 Jun 23 09:24 f3
-rw-rw-r--   1 user user    0 Jun 23 09:24 .f4
-rw-rw-r--   1 user user    0 Jun 23 09:24 f4
-rw-rw-r--   1 user user    0 Jun 23 09:24 f5
[user@PC-Fedora tmp]$ tail -n +1 *
==> f1 <==

==> f2 <==

==> f3 <==

==> f4 <==

==> f5 <==
[user@PC-Fedora tmp]$ tail -n +1 * .*
==> f1 <==

==> f2 <==

==> f3 <==

==> f4 <==

==> f5 <==

==> . <==
tail: error reading '.': Is a directory
[user@PC-Fedora tmp]$ 


답변1

zshGNU 사용 tail(모든 tail 구현이 여러 파일 이름 인수를 사용할 수 있는 것은 아니며, 모든 것이 파일 이름을 표시하는 것은 아닙니다):

() { (($# == 0)) || tail -vn +1 -- "$@" < /dev/null; } *(ND)

-vDdotglob의 경우, Nnullglob의 경우 glob의 확장자를 전달하고 현재 디렉터리가 비어 있는지 확인하는 익명 함수를 사용하여 파일이 하나만 있어도 파일 이름이 계속 인쇄되는 특수한 경우입니다 .

</dev/nulltailGNU가 이라는 파일 이름을 전달하면 -대신 stdin을 읽는다는 사실을 부분적으로 완화하는 것입니다 . 여기서는 stdin을 읽는 것을 방지 하지만 여전히 이라는 파일 을 읽지 않습니다 -. ."${@/#%-/./-}""$@"-./-==> ./- <====> - <==-==> standard input <==

제한하려면 glob 한정자를 추가 .(또는 ) 해야 할 수도 있습니다.-.정기적인이는 현재 디렉터리( )에 디렉터리나 다른 유형의 비정규 파일이 있는 경우에만 오류를 방지하거나 더 심각한 상황을 방지합니다 *(ND-.).

ksh93GNU와 동일 tail:

(
  FIGNORE='@(.|..)'
  set -- ~(N)*
  (($# == 0)) || tail -vn +1 -- "$@" < /dev/null
)

bashGNU와 동일 tail:

(
  setopt -s nullglob dotglob
  set -- *
  (($# == 0)) || tail -vn +1 -- "$@" < /dev/null
)

또는 GNU tail및 모든 POSIX sh( 에뮬레이션 zsh에서만 포함 sh)를 사용하여 일반 파일 또는 일반 파일에 대한 심볼릭 링크로 제한하고 -로 바꾸지만 다른 파일보다 먼저 파일을 처리 ./-하기 때문에 파일을 다른 순서로 처리할 수도 있습니다 .*.

(
  set --
  for file in .* *
    [ -f "$file" ] || continue
    [ "$file" = - ] && file=./-
    set -- "$@" "$file"
  done
  [ "$#" -eq 0 ] || exec tail -n +1 -- "$@"
)

또는 GNU를 사용할 수 있습니다 awk(여기서 사용됨 zsh).

() {
  (( $# == 0 )) ||
    gawk 'BEGINFILE{
            print sep "==> "substr(FILENAME, 3)" <=="
            sep = "\n"
          }
          {print}' "$@"
} *(ND-.)

awktail포함을 사용하면 -표시될 때 제거되는 접두사를 추가하여 =두 가지 문제를 모두 해결합니다 . ./파일 끝에 개행 문자가 없으면 awk가 하나를 추가합니다.

또는 루프를 사용하십시오.

sep=
for f (*(ND-.)) {
  print -r "$sep==> $f <=="
  sep=$'\n'
  cat < $f
}

( cat같은 문제가 존재합니다 -. 인수 대신 stdin에 파일을 전달하여 해결했습니다.)

관련 정보