取消归档单个文件挂起

时间:2014-06-22 18:43:20

标签: linux unix tar

我正在尝试取消归档一个非常大的目录。以下是untar整个事情的作用:

$ sudo tar -xjf itunes20140618.tbz --verbose
x itunes20140618/
x itunes20140618/genre_artist
x itunes20140618/imix_type
...etc...

但是,如果我尝试仅取消存档单个文件,它将正确执行此操作,但该命令将无限期挂起。此外,使用--verbose语句时,它不会打印任何输出。这是一个例子:

$ sudo tar -xjf itunes20140618.tbz itunes20140618/imix --verbose
[ nothing prints...it just hangs. But it does un-tar that single file ]

1 个答案:

答案 0 :(得分:1)

Tar没有中央目录;每个文件一个接一个地连接起来,所以它继续扫描文件。提取一个文件所需的时间与整个存档一样长。根据Mark Plotnick的评论,在GNU tar上,您可以使用--occurrence=1让它在找到您的文件后停止扫描。

对于OS X和其他具有不支持--occurrence = 1参数的tar的地方,解决方案将是监视文件外观的监视进程,并且一旦它保持相同的大小几秒钟,杀死焦油过程。这是一个bash函数来提供:

untarOneFile () {
    options=$1
    archivename=$2
    filename=$3
    if [[ -f "$archivename" ]]; then
        rm -rf "$filename" 2> /dev/null
        tar "$options" "$archivename" "$filename" &
        pid=$! 
        size=0
        quitCount=0
        oldsize=0
        while true; do
            [[ -f "$filename" ]] && size=$(ls -l "$filename" | cut -c 27- | sed 's/^ *//' | cut -f 1 -d ' ')
            if (( $oldsize > 0 )); then
                if (( $oldsize == $size )); then
                    (( quitCount++ ))
                else
                    quitCount=0
                fi
            fi
            (( $quitCount == 4 )) && break
            oldsize=$size
            sleep 0.5
        done
        kill $pid
    else
        echo "Archive file not found."
    fi
}

错误检查不健全,但如果你给它合法信息,它就可以了。用法是:

untarOneFile -jxvf tarArchiveFile.tar.bz file/you/want/to/extract