질문
나는 다음을 할 수 있기를 원합니다:
- 디렉터리(일반 및 숨김)의 모든 파일을 연결합니다.
- 하지만 각 연결이 시작될 때마다 각 파일의 제목을 표시하고 싶습니다.
매우 깔끔한 트릭으로 #2를 수행 할 수 있는 몇 가지 솔루션을 온라인에서 찾았 지만 여기 에는 tail -n +1 * 2>/dev/null
내가 하려는 것과 같은 파일 숨기기가 포함되지 않습니다.cat * .* 2>/dev/null
head * .* 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
zsh
GNU 사용 tail
(모든 tail 구현이 여러 파일 이름 인수를 사용할 수 있는 것은 아니며, 모든 것이 파일 이름을 표시하는 것은 아닙니다):
() { (($# == 0)) || tail -vn +1 -- "$@" < /dev/null; } *(ND)
-v
D
dotglob의 경우, N
nullglob의 경우 glob의 확장자를 전달하고 현재 디렉터리가 비어 있는지 확인하는 익명 함수를 사용하여 파일이 하나만 있어도 파일 이름이 계속 인쇄되는 특수한 경우입니다 .
</dev/null
tail
GNU가 이라는 파일 이름을 전달하면 -
대신 stdin을 읽는다는 사실을 부분적으로 완화하는 것입니다 . 여기서는 stdin을 읽는 것을 방지 하지만 여전히 이라는 파일 을 읽지 않습니다 -
. ."${@/#%-/./-}"
"$@"
-
./-
==> ./- <==
==> - <==
-
==> standard input <==
제한하려면 glob 한정자를 추가 .
(또는 ) 해야 할 수도 있습니다.-.
정기적인이는 현재 디렉터리( )에 디렉터리나 다른 유형의 비정규 파일이 있는 경우에만 오류를 방지하거나 더 심각한 상황을 방지합니다 *(ND-.)
.
ksh93
GNU와 동일 tail
:
(
FIGNORE='@(.|..)'
set -- ~(N)*
(($# == 0)) || tail -vn +1 -- "$@" < /dev/null
)
bash
GNU와 동일 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-.)
awk
tail
포함을 사용하면 -
표시될 때 제거되는 접두사를 추가하여 =
두 가지 문제를 모두 해결합니다 . ./
파일 끝에 개행 문자가 없으면 awk가 하나를 추가합니다.
또는 루프를 사용하십시오.
sep=
for f (*(ND-.)) {
print -r "$sep==> $f <=="
sep=$'\n'
cat < $f
}
( cat
같은 문제가 존재합니다 -
. 인수 대신 stdin에 파일을 전달하여 해결했습니다.)