Tarball의 xargs 인터페이스

Tarball의 xargs 인터페이스

나는 전체 아카이브를 한 번에 풀지 않고도 대형 타르볼에서 투명하게 작동할 수 있는 xargs와 같은 인터페이스를 갖고 싶습니다. 나는 xargs-tartar 볼을 RAM 디스크(/dev/shm)에 압축을 풀고 모든 파일을 나타나는 대로 처리하고 처리된 모든 파일을 즉시 삭제하는 이 쉘 스크립트의 프로토타입을 만들었습니다.

여기있어, xargs-tar:

#!/bin/bash

TAR_FILE="$1"
shift

TMP_ROOT="/dev/shm" # ...or /tmp
TMP_DIR="$(mktemp -d "$TMP_ROOT/xargs-tar-XXXXXX")"
UNTAR_DIR="$TMP_DIR/untar"
FILE_LIST="$TMP_DIR/files-list"
EXEC_FILE="$TMP_DIR/exec-file"

mkdir -p "$UNTAR_DIR"
mkfifo "$FILE_LIST"

(
    # single quotes for user's command and args
    for i in "$@"; do
            echo -n "'$i' "
    done
    echo '"$@"'
    echo 'rm "$@"'
) > "$EXEC_FILE"
chmod u+x "$EXEC_FILE"

# Background untar. Write file list (zero terminated, no directories) to named
# pipe. The output is one line delayed to make sure we print only finished file
# names.
(
    tar -v -C "$UNTAR_DIR" -xf "$TAR_FILE" \
            | awk 'BEGIN {last = "";}
                   !/\/$/ {if (last != "") print last; last=$0;}
                   END {if (last != "") print last;}' \
            | tr '\n' '\0'
) > "$FILE_LIST" &

cd "$UNTAR_DIR"
xargs --null -r sh "$EXEC_FILE" < "$FILE_LIST"

rm -rf "$TMP_DIR"

사용 예:

./xargs-tar  palemoon.tar.bz2  wc -l
      546 palemoon/libsoftokn3.so
     1437 palemoon/libnss3.so
[...]
      267 palemoon/libnssutil3.so
      220 palemoon/libsmime3.so
        6 palemoon/defaults/pref/channel-prefs.js
   379727 total

이는 다음과 동일하지만 더 빠르고 디스크 사용량이 적습니다.

tar -xf palemoon.tar.bz2
find palemoon -type f -print0 | xargs -0 wc -l
rm -rf palemoon

물론 내 xargs-tar프로토타입에는 다음과 같은 많은 개선이 필요합니다.

  • 최대 임시 공간을 제한하는 인터페이스(사용 가능한 메모리 관련)
  • 소비자가 너무 느리면 감압을 일시 중지합니다.
  • 오류 처리(중복 파일 등...)
  • tar뿐만 아니라 다른 아카이브 형식 지원
  • 등.

그래서 저는 C 언어로 구현된 진지한 프로젝트를 시작하려고 생각하고 있습니다.

지금 내 질문은 다음과 같습니다.이와 같은 것이 이미 존재합니까? 다른 사람이 유용하다고 생각합니까? 내가 시간을 낭비했나요?

알아요 tarfs, 효과가 있지만 정확히 제가 원하는 것은 아닙니다. 저는 빠르고 간단한 명령줄, 이식 가능한 파이프라인 구현을 원합니다. 요점은 압축을 푼 파일이 캐시에 있는 동안 처리된 다음 즉시 삭제된다는 것입니다.

관련 정보