나는 전체 아카이브를 한 번에 풀지 않고도 대형 타르볼에서 투명하게 작동할 수 있는 xargs와 같은 인터페이스를 갖고 싶습니다. 나는 xargs-tar
tar 볼을 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
, 효과가 있지만 정확히 제가 원하는 것은 아닙니다. 저는 빠르고 간단한 명령줄, 이식 가능한 파이프라인 구현을 원합니다. 요점은 압축을 푼 파일이 캐시에 있는 동안 처리된 다음 즉시 삭제된다는 것입니다.