仅当tar中有文件提取到我的CWD时,才将.tgz提取到特定的子文件夹中

时间:2011-10-01 06:53:34

标签: bash tar

大多数tar文件都会提取到自己的子文件夹中(因为编写开源实用程序的人都很棒)。

一些提取物进入我的cwd,这使得一切都变得混乱。我知道有一种方法可以查看tar中的内容,但我想写一个bash脚本,基本上保证我不会最终将15个文件提取到我的主文件夹中。

任何指针?

伪代码:

if [listing of tar files] has any file that doesn't have a '/' in it:
    mkdir [tar filename without extension]
    tar xzvf [tar filename] into [the new folder]
else:
    tar xzvf [tar filename] into cwd

修改

两种解决方案都很棒,我选择了以下解决方案,因为我要求使用bash脚本,而且它不依赖于额外的软件。

但是,在我自己的机器上,我使用的是aunpack,因为它可以处理更多,更多的格式。

我正在使用shell脚本一次性下载和解压缩。这是我正在使用的:

#!/bin/bash
wget -o temp.log --content-disposition $1
old=IFS
IFS='
'
r=`cat temp.log`
rm temp.log
for line in $r; do
    substring=$(expr "$line" : 'Saving to: `\(.*\)'\')
    if [ "$substring" != "" ]
    then
        aunpack $substring
        rm $substring
        IFS=$old
        exit
    fi
done
IFS=$old

2 个答案:

答案 0 :(得分:7)

atool包中的aunpack命令执行以下操作:

  

aunpack从存档中提取文件。通常人们想要全部提取   归档中的文件到单个子目录。          但是,某些归档在其根目录中包含多个文件   目录。 aunpack程序克服了这个问题          首先将文件解压缩到唯一(临时)   目录,然后尽可能将其内容移回。这个          还可以防止本地文件被错误覆盖。

答案 1 :(得分:2)

您可以使用tar选项的组合来实现此目的: 列出的tar选项是:

   -t, --list
          list the contents of an archive
提取到不同目录的

tar选项是:

   -C, --directory DIR
          change to directory DIR

因此,在您的脚本中,您可以列出文件&检查列表中是否有任何没有“/”的文件,根据该输出,您可以使用适当的选项调用tar
供您参考的样本如下:

TAR_FILE=<some_tar_file_to_be_extracted>
# List the files in the .tgz file using tar -tf
# Look for all the entries w/o "/" in their names using grep -v 
# Count the number of such entries using wc -l, if the count is > 0, create directory
if [ `tar -tf ${TAR_FILE} |grep -v "/"|wc -l` -gt 0 ];then
   echo "Found file(s) which is(are) not in any directory"
   # Directory name will be the tar file name excluding everything after last "."
   # Thus "test.a.sh.tgz" will give a directory name "test.a.sh"
   DIR_NAME=${TAR_FILE%.*}
   echo "Extracting in ${DIR_NAME}"
   # Test if the directory exists, if not then create it
   [ -d ${DIR_NAME} ] || mkdir ${DIR_NAME}
   # Extract to the directory instead of cwd
   tar xzvf ${TAR_FILE} -C ${DIR_NAME}
else
   # Extract to cwd
   tar xzvf ${TAR_FILE}
fi

在某些情况下,tar文件可能包含不同的目录。如果您发现查找由同一个tar文件提取的不同目录有点烦人,那么即使列表包含不同的目录,也可以修改脚本以创建新目录。稍微高级的样本如下:

TAR_FILE=<some_tar_file_to_be_extracted>
# List the files in the .tgz file using tar -tf
# Look for only directory names using cut, 
# Current cut option used lists each files as different entry 
# Count the number unique directories, if the count is > 1, create directory
if [ `tar -tf ${TAR_FILE} |cut -d '/' -f 1|uniq|wc -l` -gt 1 ];then
   echo "Found file(s) which is(are) not in same directory"
   # Directory name will be the tar file name excluding everything after last "."
   # Thus "test.a.sh.tgz" will give a directory name "test.a.sh"
   DIR_NAME=${TAR_FILE%.*}
   echo "Extracting in ${DIR_NAME}"
   # Test if the directory exists, if not then create it
   # If directory exists prompt user to enter directory to extract to
   # It can be a new or existing directory
   if [ -d ${DIR_NAME} ];then
     echo "${DIR_NAME} exists. Enter (new/existing) directory to extract to"
     read NEW_DIR_NAME
     # Test if the user entered directory exists, if not then create it
     [ -d ${NEW_DIR_NAME} ] || mkdir ${NEW_DIR_NAME}
   else
     mkdir ${DIR_NAME}
   fi
   # Extract to the directory instead of cwd
   tar xzvf ${TAR_FILE} -C ${DIR_NAME}
else
   # Extract to cwd
   tar xzvf ${TAR_FILE}
fi

希望这有帮助!