5

这是这种情况。我有一个需要提取和设置的 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” “,这让它有点棘手。

4

5 回答 5

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
于 2012-09-22T12:42:48.213 回答
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
于 2012-07-15T11:27:23.433 回答
0

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

cd`ls -m1`

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

“$DL_DIR”中的文件名/*
做
    回声$文件名
完毕;

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

于 2012-07-15T11:29:26.770 回答
0

我会说,用 ${FILE##*.} 去掉文件的扩展名,然后用 ${FILE%.ext*} 对目录名做相反的处理:

案例 ${FILE##*.} 在
    gz)
    焦油 xf $文件
    cd ${FILE%.tar.gz*}
    ;;
    tgz)
    焦油 xf $文件
    cd ${FILE%.tgz*}
    ;;
    压缩)
    解压 $FILE
    cd ${FILE%.zip*}
    ;;
经社理事会

只是一个小问题:你怎么知道档案中的目录是否与档案本身同名?

于 2012-09-01T09:30:24.933 回答
-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
于 2012-07-15T11:57:14.857 回答