아카이브를 추출하지 않고 아카이브 파일(예: tar.bz) 내의 디렉터리 수를 계산해야 합니다. 아카이브가 너무 커서 컴퓨팅 디렉터리를 추출하고 사용하기가 어렵습니다 ls | wc -l
.
답변1
그러면 아카이브의 모든 파일이 나열되고 /
(folders)로 끝나는 줄을 찾은 다음 줄 수를 계산해야 합니다.
tar -tvf file.tar | grep -c '/$'
편집: 최상위 디렉토리만 계산하려면 다음을 수행하십시오.
tar --exclude='./*/*' -tvf file.tar | grep -c '/$'
재귀적으로 한 단계 더 깊이 들어가고 싶다면:
tar --exclude='./*/*/*' -tvf file.tar | grep -c '/$'
등...
답변2
모든 경우에 올바르게 작동하는 유일한 방법은 다음을 사용하는 것입니다 star -find
.
star -t -v -f file.tar -find -type d | wc -l
디렉터리 이름이 슬래시로 끝나지 않는 경우에도 모든 경우에 작동합니다. 디렉토리 이름에 슬래시를 추가하는 더러운 방법은 파일 유형 "directory"가 tar 형식에 알려지지 않았던 1980년경에 도입되었습니다. POSIX에서는 이를 요구하지 않으며 일부 tar 구현에서는 디렉토리 이름에 슬래시를 추가하지 않습니다.
'^ 0 d'
경로 이름에 개행 문자가 포함된 경우 실제 목록 줄의 시작 부분만 계산하도록 grep for를 수행하거나 다음을 사용해야 할 수도 있습니다 .
star -t -f file.tar -find -type d -print0 -false
그런 다음 출력을 다음과 같이 파이프하여 출력에서 nul 문자 수를 계산합니다.
LC_ALL=C tr -cd '\0' | wc -c
답변3
GNU tar
또는 를 사용하면 bsdtar
다음을 사용할 수 있습니다.
tar tvf file.tar | grep -c '^d'
tar
GNU와 GNU는 모두 filenames 에서 개행 문자를 렌더링하는 것과 비슷한 방식 으로 bsdtar
긴 목록( )에 있는 줄의 첫 번째 문자로 파일 유형을 출력하므로 아카이브 멤버 이름에 개행 문자가 포함된 경우에도 여전히 작동합니다.tv
ls -l
\n
이는 /
후행 문자를 찾는 것보다 더 안정적 입니다.@schily가 말했듯이 그것이 거기에 있을 것이라는 보장은 없습니다..
POSIXly에서는 다음을 사용할 수 있습니다.
pax -o listopt=%.1M < file.tar | grep -cx d
-o listopt
모든 구현이 이를 지원하는 것은 아니지만 pax
, 특히http://www.mirbsd.org/pax.htm우분투에서 pax를 찾았습니다.
pax -v < file.tar | grep -c '^d'
이식성이 더 높지만 줄 바꿈이 포함된 파일 이름으로 인해 실패할 수 있습니다.