2012-07-15 6 views
5

के साथ अनचाहे निर्देशिका में सीडी यह स्थिति है। मेरे पास उन 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 

यदि यह समझा नहीं जाता है तो कृपया कहें। मैं वास्तव में इस समस्या को दूर करना चाहता हूं लेकिन मुझे इसे समझने में कठिन समय है।

चूंकि मैं चाहता हूं कि यह यूआरएल के किसी भी सेट के लिए काम करे, जिसमें ".tar.gz" या एक प्रारूप ".zip" जैसे दो प्रारूप हो सकते हैं और "Python2.3.4" जैसे फ़ाइल नाम में हो सकता है या हो सकता है। "Nginx" नहीं हो सकता है, यह थोड़ा मुश्किल बनाता है।

+2

एक तरफ, आपकी पहली चार पंक्तियां बैश में मान्य असाइनमेंट नहीं हैं। बाएं हाथ के पक्षों को डॉलर के संकेतों के साथ prefixed नहीं किया जाना चाहिए, और बराबर चिह्न के आसपास कोई जगह की अनुमति नहीं है। एक सही उदाहरण: 'डीएलडीआईआर =/ऑप्ट /'। – chepner

उत्तर

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

बीटीडब्ल्यू, एक अच्छा संग्रह पहचान केस के लिए/usr/bin/lesspipe देखें ... esac –

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

यह वह जगह है जहां यह मुश्किल है। फ़ाइल प्रारूप हमेशा टैर नहीं होगा .zip या .tar.gz –

+0

मैं इस सामान के लिए वास्तव में नया हूं, तो क्या आप यह बताएंगे कि यह कैसे कार्य करता है? मैं इसके चारों ओर अपना सिर नहीं ले सकता। –

+0

बहुत बहुत धन्यवाद –

0

आप जानते हैं कि वहाँ $ DL_DIR में ठीक एक निर्देशिका होने जा रहा है, तो आप उपयोग कर सकते हैं:

 
cd `ls -m1` 

एक और दृष्टिकोण फाइलों के माध्यम से लूप होगा निर्देशिका:

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

आप आवश्यकतानुसार फ़ाइल परीक्षण और अन्य चेक कर सकते हैं।

+0

अच्छा विचार है, लेकिन इस निर्देशिका में बहुत कुछ होगा। क्या हम समय पर आधारित कर सकते हैं? नवीनतम बनाए गए फ़ोल्डर का नाम कॉपी करें? हालांकि ऐसा करने का एक बुरा तरीका लगता है। –

+0

@ जेम्स विल्सन: उस स्थिति में, आप $ DL_DIR में फ़ाइलों के माध्यम से पाश कर सकते हैं। मेरा संपादित उत्तर देखें। –

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

मैं, कहेंगे $ के साथ फ़ाइल के विस्तार पट्टी {। फ़ाइल ## *} और $ का उपयोग कर निर्देशिका नाम के साथ दूसरी तरह के आसपास करना {फ़ाइल% .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

बस एक छोटी सी समस्या: आप कैसे जानते हैं कि संग्रह में निर्देशिका एक ही नाम है करते संग्रह ही वायुसेना?

+0

आप इसके लिए बेसनाम का भी उपयोग कर सकते हैं: 'सीडी $ (बेसनाम $ FILE)' – HighKing

संबंधित मुद्दे