焦油球的 xargs 接口

焦油球的 xargs 接口

我希望有一个类似 xargs 的界面,可以在大型 tar 球上透明地操作,而无需立即解压整个存档。我已经制作了这个 shell 脚本原型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
  • ETC。

这就是为什么我正在考虑启动一个严肃的项目,用 C 语言实现。

我现在的问题是:这样的东西已经存在了吗?其他人也会觉得它有用吗?我浪费时间了吗?

我知道tarfs,确实有用,但不完全是我想要的。我想要快速、简单的管道命令行、可移植的实现。关键是:未解压的文件在缓存中时会被处理,然后立即删除。

相关内容