2017-05-29 119 views
0

這是問題。我有一個Ubuntu 14.04服務器上有超過100,000K文件的目錄。我需要在後臺處理這些文件,因此我編寫了一個shell腳本,將這些文件轉換爲較大的文件,然後刪除該文件。然而,這個問題的起因在於它也是處理腳本和輸出文件的貓。有任何想法嗎?將文件名與字符串中的文件名進行比較的Shell腳本問題

#!/bin/sh 
c=0 
#loop through 1000 results at 1 time 
d=1000 

    while [ $c -lt $d ] 
    do 
     filename=$(`ls | head -n 1`) 
     #echo $filename 

    if [ $filename == "process.sh" ] 
    then 
    break 
    fi 

    if [ $filename == "file.txt" ] 
    then 
    break 
    fi 

    cat `ls | head -n 1` >> file.txt 
    rm `ls | head -n 1` 
    #echo $c 
    c=`expr $c + 1` 

done 
+0

您處理完成後,您可以刪除有問題的行:'sed的-i.bak「/模式匹配/ d」/file.txt' –

+0

的問題是,正在處理的文件號碼不固定。總是有批量添加的文件。我的意思是有時候有10萬甚至更少。我想我可以首先得到一些文件,從循環中得到-1,因爲其他文件都有數字名稱。不知道,我需要刷一下我對shell腳本的瞭解。 –

+0

除非我錯過了某些東西,'ls | head -n 1'將始終返回第一個文件。我沒有看到這個腳本通過文件進行。也不應該把'filename = $('ls | head -n 1')這行''filename = $(ls | head -n 1)'?當做簡單的數學運算時,我更喜歡格式'c = $((c + 1))'。 – Deathgrip

回答

0

您應該在每個循環中只撥打ls | head -n 1一次。檢查之後,再次調用ls | head -n 1,結果可能會不同(併發process.sh仍在運行或新文件)。
你想如何獲得file.txt之後列出的文件?你正在打破循環,其他文件將被跳過。不要繼續改變這一點,因爲你會繼續分配file.txtfilename
總是使用雙引號爲你的瓦爾(想想my file.txt),你可能也想習慣大括號。

假設你的批處理工作正常,並且它處理了最後一個非特殊文件。 "${filename}"將是空的!因此,從測試if [ -f "${filename}" ]開始,這將解決目錄中的問題。

我真的希望你有權刪除這些文件,所以你不會被卡住處理相同的文件1000次。

你不應該處理ls輸出,所以替代

ls | egrep -v "file.txt|process.sh" | head -n 1 

只是用不同的方式做是錯誤的。

當您得到一個"${filename}"並且想根據多個字符串檢查這個時,可能需要使用case "${filename}" in ... esac

當文件沒有換行符時,可以使用findxargs

# First test it 
find . -type f \(! -name process.sh -a ! -name file.txt \) 2>/dev/null | 
    head -10 | xargs -I % sh -c 'echo "File %"; echo "rm -f %"' 
# Looking nice? 
find . -type f \(! -name process.sh -a ! -name file.txt \) 2>/dev/null | 
    head -1000 | xargs -I % sh -c 'cat "%" > file.txt; rm -f "%"' 
0

我會重寫腳本。

#!/bin/bash 

c=0 
d=1000 

for file in $(find . -maxdepth 1 -type f \(! -name process.sh -a ! -name file.txt \)) 
do 
    cat $file >> file.txt 
    rm $file 
    c=$((c+1)) 
    if [ $c -eq $d ]; then 
     break 
    fi 
done 
相關問題