2013-08-28 69 views
1

我期待在Linux中創建一個bash/Perl腳本,將根據文件名恢復的.gz文件:ZCAT文件,輸出其內容到另一個文件基於原文件名

_path_to_file.txt.gz 
_path_to_another_file.conf.gz 

凡下劃線形成目錄結構..所以上面兩個是:

/path/to/file.txt 
/path/to/another/file.conf 

這些都是在/備份/目錄..

我想編寫一個腳本,將貓每.GZ文件到其正確的位置通過改變_到/找到正確的路徑 - 這樣_path_to_another_file.conf.gz的內容來替換

zcat _path_to_another_file.conf.gz > /path/to/another/file.conf 

我已經通過創建開始/path/to/another/file.conf文一個正確的目標文件名在其中的文件..我可以創建另一個文件列出其中的原始文件名,並讓腳本逐行?

ls /backup/ |grep .gz > /backup/backup_files && sed -i 's,_,\/,g' /backup/backup_files && cat /backup/backup_files 

Whatcha在想什麼?

+0

Aloha,Rob! StackOverflow是一個很棒的網站。如果您通過搜索欄閱讀了本頁頂部的「關於」頁面,您會看到一個徽章。 –

回答

1

這裏有一個bash腳本,應該做你想要什麼:

#!/bin/bash 
for f in *.gz; do 
    n=$(echo $f | tr _ /) 
    zcat $f > ${n%.*} 
done 

它遍歷該以.gz結尾的所有文件,並把它們提取到由他們與_文件名以代替/代表的路徑。

+0

謝謝!嘗試了第一個版本,並有.gz ..所以我要切斷它..然後看到你更新它..這個當前一個寫一個名爲$ {n%。*}的文件到備份目錄雖然.. – user2726407

+0

對不起,我沒有在我身邊測試它......這個應該可以工作,刪除'$ {n%。*}'周圍的引號。 – 2013-08-28 18:02:29

+0

啊,我們去..謝謝你! – user2726407

1

這一定不是一個可逆映射(如果原始文件被命名爲high_scores例如?是編碼特別,例如用雙下劃線爲high__scores.gz?),但如果你只是想取了個名字和翻譯_/並在最後刪除.gzsed將做到這一點:

for name in /backup/*.gz; do 
    newname=$(echo "$name" | 
     sed -e 's,^/backup/,,' \ 
      -e 's,_,/,g' \ 
      -e 's/\.gz$//') 
    echo "zcat $name > $newname" 
done 

確保它的工作原理正確,然後取出回聲,留下(上面是完全未經測試!):

zcat "$name" > "$newname" 

(引號防止名稱中的空格)。

+0

謝謝 - 這也有效 - 我不能upvote,但不幸的是。 – user2726407

相關問題