我想将 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