大多数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
答案 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
希望这有帮助!