xargs interface para bolas de alcatrão

0

Eu quero ter uma interface parecida com xargs para operar de forma transparente em grandes bolas tar sem descompactar todo o arquivo de uma só vez. Eu já fiz esse protótipo do shell script xargs-tar , que descompacta uma bola tar no disco RAM (/ dev / shm), processa todos os arquivos quando eles aparecem e exclui todos os arquivos processados imediatamente.

Aqui está, 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' '
./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
' ) > "$FILE_LIST" & cd "$UNTAR_DIR" xargs --null -r sh "$EXEC_FILE" < "$FILE_LIST" rm -rf "$TMP_DIR"

Exemplo de uso:

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

que deve ser equivalente (mas mais rápido e menos uso de disco) para:

#!/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' '
./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
' ) > "$FILE_LIST" & cd "$UNTAR_DIR" xargs --null -r sh "$EXEC_FILE" < "$FILE_LIST" rm -rf "$TMP_DIR"

É claro que meu protótipo xargs-tar precisa de muitas melhorias, como

  • interface para limitar o espaço max temp (em relação à memória disponível)
  • pausando o untar quando o consumidor está muito lento
  • tratamento de erros (arquivos duplicados, etc.)
  • suportando outros formatos de arquivo, não apenas tar
  • etc.

É por isso que estou pensando em iniciar um projeto sério, implementação em C.

A minha pergunta é agora: Já existe algo parecido? Outras pessoas acham que é útil também? Eu perco meu tempo?

Eu sei tarfs , realmente útil, mas não exatamente o que eu quero. Eu quero linhas de comando rápidas e simples, implementação portátil. A chave é: Os arquivos não alcatifados são processados enquanto ainda são armazenados em cache e, em seguida, excluídos imediatamente.

    
por rudimeier 13.05.2017 / 02:59

0 respostas