2016-01-13 71 views
0

我有一個包含所有tgz文件的目錄。目前,我有我運行會已更新:Bash腳本提取目錄中的所有.tgz

  1. 您可以在目錄中第一個參數的腳本
  2. 提取tgz
  3. cd到提取的文件夾
  4. ,然後運行我的負載腳本
  5. 並繼續下一個tgz ..

如下所示。

目前這個腳本的工作,但如果有人不僅僅是目錄名稱(例如,./myScript /全/路徑/到/目錄)

dirname=$1 
cur_dir=`pwd` 

echo The directory you are about to extract is $dirname 

echo $(ls ${cur_dir}/${dirname}/*.tgz) 

echo Your current directory is ${cur_dir} 

for tgz in $(ls ${cur_dir}/${dirname}/*.tgz) ; do # <---- I think there is a better way of doing this please advise 
     echo the tgz you are about to extract now is ${tgz} 
     cd ${dirname};    #cd into input directory 
     tar -xvzf ${tgz};   #extract tgz 
     cd ${tgz%%.tgz};   #cd into the folder you extracted 
     loadItExit;    #run my other script to load 
     cd ../..;     #move up two levels back to original path 

done 
+0

'for fname in $ {FNAME%/ *}/* TGZ。 do'將循環到第一個給定文件的目錄中的所有'* .tgz'。 – Kellerspeicher

回答

1

的東西看起來放在一個參數以外它會失敗這樣可以工作

dirname="$1" 
for tgz in $(ls ${dirname}/*.tgz) ; do 
    echo "tar -xzf ${tgz}"; 
    echo "cd ${tgz%%.tgz}"; 
    echo "LoadIt"; 
    echo "cd .."; 
done 

明顯的回聲只是爲了演示

註釋避免使用ls是公平的,如果你是不是在CONTRO你的環境。將你感興趣的文件的過濾器進一步推送到一個不太具體的集合的循環中。

取決於你有多少控制,你可能需要更多的偏執測試。

dirname="$1" 
for tgz in ${dirname}/* ; do 
    if [ "${tgz##*\.}" == "tgz" ] then 
     echo "tar -xzf ${tgz}"; 
     echo "cd ${tgz%%.tgz}"; 
     echo "LoadIt"; 
     echo "cd .."; 
    fi 
done 

編輯註釋解釋if聲明

首先在bash炭[是相同的命令test 要在保持空間[後和前]

[ ... ]是表達式(謂詞) ,其計算結果爲truefalse

在這種情況下,我們使用變量替換
其中一個shell變量的值,$tgz這裏,
被之前修改使用

它始終是最安全的附上的名字變量 後面的$花括號{ ...}

但是這樣做也可以讓你註釋變量調用
用修改後的值來代替正常的變量值

我的快速和骯髒的助記符記住註釋
和它們的功能是看所述$
(對不起非英語非QWERTY鍵盤佈局)的任一側
並注意#散列或磅字符前進$
這樣${name#<regexp>}刪除第一場比賽
正則表達式<regexp>
的 的#後和}
開始變量值的之前。

同樣的%是後$${name%<regexp>}
刪除鍵從可變

兩個註釋的值正則表達式
最後匹配可成倍##%%到意思是:
刪除最長正則表達式的匹配
而不是最短的。

所以
"${tgz##*\.}" == "tgz"
手段刪除變量$tgz直至幷包括從值中最後一個點
一切,看看剩下
正好等於該字符串"tgz"

網絡搜索上「bash變量替換」
和「bash測試」 將帶你進一步

+0

[不要解析'ls'的輸出](http://mywiki.wooledge.org/ParsingLs) –

+0

如果我想傳入整個目錄呢?像這樣的./my_script/path/to/my /目錄 – kkmoslehpour

+0

@tomc可以請你在代碼旁邊的一些註釋來解釋if語句。 – kkmoslehpour

相關問題