我正在尝试取消归档一个非常大的目录。以下是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 ]
答案 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