Bash - 使用可变URL将CD转换为Untared目录

时间:2012-07-15 11:14:42

标签: regex bash shell unix

就是这种情况。我有一个我需要提取和设置的URL列表。它的所有变量驱动,但在我提取后,我不知道我的文件夹将被调用。如果我不知道它叫什么,我就不能把CD放进去。

$DL_DIR = /opt/
$URL = http://nginx.org/download/nginx-1.3.3.tar.gz
$FILE=${URL##*/}
$CONFIG = "-- core"

cd "$DL_DIR"
wget $URL
tar xzf $FILE
cd <HOW DO I GO INTO IT?>
./configure "$CONFIG"
make
make install
rm $FILE

如果这不解释,请说。我真的想解决这个问题,但我很难解释它。

因为我想让它适用于任何一组URL,这些URL可能有两种格式,如“.tar.gz”或一种格式“.zip”,并且可能在文件名中有。如“Python2.3.4”或者可能不是“Nginx”,它让它有点棘手。

5 个答案:

答案 0 :(得分:1)

#! /bin/bash
   #
   # Problem: 
   #  find the path of the "root" folder in an archive
   #
   # Strategy: 
   #  list all folders in the archive.
   #  sort the list to make sure the shortest path is at the top.
   #  print the first line
   # 
   # Weak point:
   #  assumes that tar tf and unzip -l will list files in a certain way
   #  that is: paths ending with / and that the file-list of unzip -l 
   #  is in the fourth column.
   # 

   LIST_FILES=
   FILE=$1
   case ${FILE##*.} in
       gz)
       LIST_FILES="tar tf $FILE"
       ;;
       tgz)
       LIST_FILES="tar tf $FILE"
       ;;
       zip)
       LIST_FILES='unzip -l '$FILE' | awk "{print \$4}"'
       ;;
   esac
   ARCHIVE_ROOT=$(
   echo $LIST_FILES | sh |\
       grep '/$'|\
       sort |\
       head -n1
   )

   # we should have what we need by now, go ahead and extract the files.
   if [ -d "$ARCHIVE_ROOT" ]; then
       cd "$ARCHIVE_ROOT"
   else
       # there is no path (whoever made the archive is a jerk)
       # ...or the script failed (see weak points)
       exit 1
   fi

答案 1 :(得分:0)

extract_dir=$(tar -tf $FILE | cut -d/ -f1 | uniq)
cd $extract_dir

extract_dir=$(tar -tf $FILE | head -1 | cut -d/ -f1)
cd $extract_dir

ls > .dir_list_1    # save current directory listing as hidden file
tar xzf $FILE       # extract the $FILE
ls > .dir_list_2    # save the directory listing after extraction...
                    # ...as another hidden file
# diff two lists saved in hidden files, this will help you get the created dir
# grep '>' symbol, to get the inserted line
# use head to get the dir in case there are multiple lines (not necessary)
# use cut to remove the '>' and get the actual dir name, store in extract_dir
extract_dir=$(diff .dir_list_1 .dir_list_2 | grep '>' | head -1 | cut -d' ' -f2)
# remove temporary files 
rm .dir_list_*
cd $extract_dir

答案 2 :(得分:0)

如果您知道$ DL_DIR中只有一个目录,那么您可以使用:

cd `ls -m1`

另一种方法是循环遍历目录的文件:

for filename in "$DL_DIR"/*
do
    echo $filename
done;

您可以根据需要执行文件测试和其他检查。

答案 3 :(得分:0)

我说,用$ {FILE ## *。}删除文件的扩展名,然后使用$ {FILE%.ext *}对目录名执行相反的操作:

case ${FILE##*.} in
    gz)
    tar xf $FILE
    cd ${FILE%.tar.gz*}
    ;;
    tgz)
    tar xf $FILE
    cd ${FILE%.tgz*}
    ;;
    zip)
    unzip $FILE
    cd ${FILE%.zip*}
    ;;
esac

只是一个小问题:如何知道存档中的目录是否与存档本身具有相同的名称?

答案 4 :(得分:-1)

这个怎么样:

rm -rf tmpdir
mkdir tmpdir && cd tmpdir || exit
wget "$URL" || exit 1
case "$(ls)" in
  *.tar.gz|*.tgz)
  tar xzf $(ls)
  ;;
  *.zip)
  unzip $(ls)
  ;;
esac
for d in $(ls -d)
do
  ( cd "$d" 2>/dev/null && ./configure && make && make install; )
done