2012-07-15 10 views
5

Esta es la situación. Tengo una lista de URLs que necesito extraer y configurar. Es todo impulsado por variables, pero después de extraerlo, no sé cómo se llamará mi carpeta. No puedo escuchar CD si no sé cómo se llama.Bash - CD en el directorio sin almacenamiento con variable URL

$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 

Si esto no lo explica, por favor diga. Realmente quiero superar este problema, pero estoy teniendo dificultades para explicarlo.

Como yo quiero que esto funcione para cualquier conjunto de URL que puede tener dos formatos como ".tar.gz" o un formato ".zip" y puede tener. Es en el nombre de fichero como 'Python2.3.4' o no puede "Nginx", lo hace un poco complicado.

+2

Como un lado, sus primeras cuatro líneas no son asignaciones válidas en bash. Los lados izquierdos no deben estar precedidos por signos de dólar, y no se permite ningún espacio alrededor del signo igual. Un ejemplo corregido: 'DLDIR =/opt /'. – chepner

Respuesta

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 
+0

Por cierto, mire en/usr/bin/lesspipe para un buen caso de detección de archivos ... esac –

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

o

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

o

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 
+0

Aquí es donde es complicado. El formato de archivo no siempre será tar, podría ser .zip o .tar.gz –

+0

. Soy realmente nuevo en este tema, ¿me gustaría explicar cómo funciona esto? No puedo entenderlo. –

+0

Muchas gracias –

0

Si sabe que no va a ser exactamente un directorio en $ DL_DIR, entonces usted puede utilizar:

 
cd `ls -m1` 

Otro enfoque sería recorrer los archivos del directorio:

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

Puede realizar pruebas de archivos y otras verificaciones según sea necesario.

+0

Buena idea, pero habrá muchas en este directorio. ¿Podríamos hacerlo basándonos en el tiempo? Copie el nombre de la carpeta más nueva creada? Parece una mala forma de hacerlo. –

+0

@JamesWillson: En ese caso, podría recorrer los archivos en $ DL_DIR. Ver mi respuesta editada. –

-1

¿Qué tal esto:

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 
0

diría, despojar a la extensión del archivo con $ {. ARCHIVO ## *} y hago al revés con el nombre del directorio usando $ {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

Sólo hay un pequeño problema: ¿cómo saber si el directorio en el archivo tiene el mismo nombre del archivo mismo af?

+0

También podría usar el nombre base para esto: 'cd $ (basename $ FILE)' – HighKing

Cuestiones relacionadas