私は、アーカイブ全体を一度に解くことなく、大きなタールボールで透過的に動作できる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
、効果がありますが、正確に私が望むものではありません。私は迅速で簡単なコマンドライン、移植可能なパイプライン実装を望んでいます。要点は、解凍したファイルがキャッシュ内にある間に処理され、すぐに削除されることです。