使用 tar 命令提取到文件夹

使用 tar 命令提取到文件夹

我想将 tar.bz2 文件解压到特定文件夹。问题是tar xjf会提取内容而不提取到文件夹。假设我有1.tar.bz2。我希望得到这样的结果

1/a.txt
1/b.txt
...

然而现在我只看到

a.txt
b.txt
....

我该怎么办?我正在寻找一个自动化解决方案。在 Windows 中,winrar 有“提取到”与 rar 文件同名的文件夹的选项

答案1

mkdir 1 
tar xf archive.tar -C 1

function untar2folder {
    local folder=`echo "$1" |
    sed -E 's/(\.)?(tar|t)?(\.)?(gz|z|bz2|bz|lz|lzma|xz)$//'`
    mkdir "$folder"
    tar xf "$1" -C "$folder";
}

参考
Gentoo /usr/bin/lesspipe.sh

/bin/bash #!/bin/bash
#
# 'less' 的预处理器。当设置此环境变量时使用:
# LESSOPEN="|lesspipe %s"

# TODO:更好地处理压缩文件

[[ -n ${LESSDEBUG} ]] && 设置 -x

陷阱‘出口 0’ PIPE

guesscompress() {
    案例“$1”
        *.gz|*.z) 回显“gunzip -c”;;
        *.bz2|*.bz) 回显“bunzip2 -c”;;
        *.lz) 回显“lzip -dc”;;
        *.lzma) 回显“unlzma -c”;;
        *.xz) 回显“xzdec”;;
        *)回声“猫”;;
    埃萨克
}

lesspipe_file() {
    本地输出=$(文件-L-“$1”)
    本地后缀
    案例 ${out}
        *“ 7-zip 存档”*)后缀=“7z”;;
        *" ar 档案"*) 后缀="a";;
        *“ CAB 安装程序”*)后缀=“cab”;;
        *“ cpio 档案”*)后缀=“cpio”;;
        *“ELF”*)后缀=“elf”;;
        *“ LHa” *档案*) 后缀=“lha”;;
        *“ troff “*)后缀=“man”;;
        *"脚本文本"*) suffix="sh";;
        *"共享对象"*)后缀="so";;
        *" tar 档案"*) 后缀="tar";;
        *" Zip 存档"*) 后缀="zip";;
        *”:数据”)hexdump -C --“$1”; 返回 0;;
        *)返回1;;
    埃萨克
    lesspipe "$1" ".${suffix}"
    返回 0
}

lesspipe() {
    本地比赛=$2
    [[ -z ${匹配} ]] && 匹配=$1

    本地解压缩器=$(guesscompress“$match”)

    # 用户过滤器
    如果 [[ -x ~/.lessfilter ]] ; 然后
        ~/.lessfilter "$1" && 退出 0

    本地忽略
    忽略 ${LESSIGNORE} 中的 ; 执行
        [[ ${match} == *.${ignore} ]] && 退出 0
    完毕

    案例“$match”

    ### 文档文件 ###
    *.[0-9n]|*.man|\
    *.[0-9n].bz2|*.man.bz2|\
    *.[0-9n].gz|*.man.gz|\
    *.[0-9n].lzma|*.man.lzma|\
    *.[0-9][az].gz|*.[0-9][az].gz)
        本地输出 = $(${DECOMPRESSOR} -- “$1” | 文件 - )
        案例 ${out}
            *troff*)
                # 需要确保我们将路径传递给 man,否则它会尝试
                # 在 man 搜索路径中定位“$1”
                如果 [[ $1 == /* ]] ; 那么
                    男人——“$1”
                别的
                    人--“。/$1”
                ;;
            *文本*)
                ${DECOMPRESSOR} -- "$1"
                ;;
            *)
                # 我们可以匹配一个库(libc.so.6),所以让
                # `file` 搞清楚这是啥东西
                lesspipe_file“$1”
                ;;
        埃萨克
        ;;
    *.dvi) dvi2tty "$1" ;;
    *.ps|*.pdf) ps2ascii “$1”|| pstotext “$1”|| pdftotext “$1”;;
    *.doc) antiword "$1" || catdoc "$1" ;;
    *.rtf) unrtf --nopict --text "$1" ;;
    *.conf|*.txt|*.log) ;; # 强制 less 直接处理这些 #150256

    ### 网址 ###
    (网址:ftp://*|http://*|*.htm|*.html)
        对于 links2 中的 b 链接 lynx ;执行
            ${b} -dump "$1" && 退出 0
        完毕
        html2text 样式漂亮的“$1”
        ;;

    ### Tar 文件 ###
    *.tar|\
    *.tar.bz2|*.tar.bz|*.tar.gz|*.tar.z|\
    *.tar.lz|*.tar.tlz|\
    *.tar.lzma|*.tar.xz)
        ${DECOMPRESSOR} -- "$1" | tar tvvf -;;
    *.tbz2|*.tbz|*.tgz|*.tlz|*.txz)
        lesspipe "$1" "$1".tar.${1##*.t} ;;

    ### 杂项档案 ###
    *.bz2|\
    *.gz|*.z|\
    *.lz|\
    *.lzma|*.xz)${DECOMPRESSOR}——“$1”;;
    *.rpm) rpm -qpivl --changelog -- "$1" ;;
    *.cpi|*.cpio) cpio -itv /dev/null ;然后
            dpkg——信息“$1”
            dpkg --contents "$1"
        别的
            AR 电视“$1”
            ar p“$1”数据.tar.gz | tar tzvvf -
        ;;

    ### 文件系统 ###
    *.squashfs) unsquashfs -s "$1" && unsquashfs -ll "$1" ;;

    ### 媒体 ###
    *.bmp|*.gif|*.jpeg|*.jpg|*.ico|*.pcd|*.pcx|*.png|*.ppm|*.tga|*.tiff|*.tif)
        识别“$1”||文件-L--“$1”
        ;;
    *.avi|*.mpeg|*.mpg|*.mov|*.qt|*.wmv|*.asf|*.rm|*.ram)
        midentify“$1”||文件-L-“$1”
        ;;
    *.mp3)mp3info“$1”|| id3info "$1" ;;
    *.ogg) ogginfo "$1" ;;
    *.flac) metaflac --list "$1" ;;
    *.torrent) torrentinfo "$1" || torrentinfo-console "$1" || ctorrent -x "$1" ;;
    *.bin|*.cue|*.raw)
        # 并非所有 .bin/.raw 文件都是 cd 映像 #285507
        # 如果 .cue 不存在,或者
        # cd-info 无法正确解析内容
        [[ -e ${1%.*}.cue ]] \
            && cd 信息 --no-header --no-device 信息 "$1" \
            || lesspipe_file“$1”
        ;;
    *.iso)
        iso_info=$(isoinfo-d-i“$1”)
        回显“${iso_info}”
        # Joliet 输出覆盖 Rock Ridge,因此优先选择更好的 Rock
        案例 ${iso_info}
            *$'\n'“Rock Ridge”*) iso_opts="-R";;
            *$'\n'“乔利埃特”*) iso_opts="-J";;
            *)iso_opts =“”;;
        埃萨克
        isoinfo-l ${iso_opts}-i“$1”
        ;;

    ### 加密内容 ###
    *.crl) openssl crl -hash -text -noout -in "$1" ;;
    *.pem) openssl x509 -hash -text -noout -in "$1" ;;

# 这可能不是一个好主意:)
# ### 设备节点 ###
/dev/[hs]d[az]*)
# fdisk -l "${1:0:8}"
# [[ $1 == *hd* ]] && hdparm -I "${1:0:8}"
# ;;

    ### 其他一切 ###
    *)
        案例 $(( recur++ )) 在
            # 也许由于大小写问题,我们不匹配......
            0)lesspipe“$1” “$(echo $1 | LC_ALL=C tr'[:upper:]''[:lower:]')”;;

            # 也许我们没有匹配,因为文件的名字很奇怪……
            1)lesspipe_file“$1”;;
        埃萨克

        # 因此上面没有匹配项...最终退回到外部
        # 着色包。这里没有匹配,所以我们不必担心
        # 关于与随机包保持同步。任何着色工具
        # 您使用的不应该将有关不支持的文件的错误输出到
        # stdout。如果是,那就是你的问题。

        # 允许人们在不想要颜色时关闭颜色
        案例 ${LESSCOLOR}
            总是)LESSCOLOR=2;;
            [yY][eE][sS]|[yY]|1|true) LESSCOLOR=1;;
            [nN][oO]|[nN]|0|false) LESSCOLOR=0;;
            *) LESSCOLOR=0;; # 默认无颜色 #188835
        埃萨克
        如果 [[ ${LESSCOLOR} != "0" ]] && [[ -n ${LESSCOLORIZER=code2color} ]] ; 然后
            # 2:仅当用户强制时才着色……
            # 1:...或者我们知道更少的人会处理原始代码——这将
            # 无法检测 -seiRM,因此请自行设置 LESSCOLORIZER
            如果 [[ ${LESSCOLOR} == "2" ]] || [[ " ${LESS} " == *" -"[rR]" "* ]] ; 然后
                LESSQUIET=true ${LESSCOLORIZER}“$1”

        # 除了少做交易,别无他法
        出口 0
        ;;
    埃萨克
}

如果 [[ -z $1 ]] ; 那么
    echo "用法:lesspipe"
elif [[ $1 == “-V” || $1 == “--version” ]] ; 然后
    编号=“cvsid”
             (很多想法都窃取自其他项目/发行版)


    末梢血
    更少 -V
elif [[ $1 == "-h" || $1 == "--help" ]] ; 然后

        lesspipe 具体设置:
          LESSCOLOR env-切换输出颜色(否/是/始终)
          LESSCOLORIZER env - 用于为输出着色的程序(默认值:code2color)
          LESSIGNORE - 要忽略的扩展列表(不要做任何花哨的事情)

        您也可以通过创建可执行文件来创建每个用户的过滤器:
          〜/ .lessfilter
        向它传递一个参数:要显示的文件。

        要使用 lesspipe,只需添加到您的环境中:
          导出 LESSOPEN="|lesspipe %s"

        运行“less --help”或“man less”获取更多信息
    末梢血
elif [[ -d $1 ]] ; 然后
    ls -alF--“$1”
别的
    重复=0
    [[ -n ${LESSDEBUG} ]] \
        && lesspipe "$1" \
        || lesspipe "$1" 2> /dev/null

答案2

通常可以使用 -C 开关重定向存档文件的输出。我还喜欢使用 -v 开关,这样就可以显示输出,让我知道发生了什么。

tar xvf 档案.tar -C ../1

http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=1

相关内容