2012-12-30 46 views
0

嗨,大家好我有一個grep問題。我不知道shell腳本中是否有其他搜索代碼。 我想要備份存儲在我的閃存盤中的AhmetsFiles文件夾,但同時我必須將它們按其擴展名分組,並將它們保存到[extensionName]文件夾中。grep間距錯誤

AhmetsFiles

一個例子:/media/FlashDisk/AhmetsFiles/lecture.pdf必須存儲在/ home/$(WHOAMI)/桌面/備份/ PDF

問題是我不能複製一個名稱中包含空格的文件。(講座2.pptx) 這裏介紹了我的代碼。

filename="/media/FlashDisk/extensions" 
    count=0 
    exec 3<&0 
    exec 0< $filename 

    mkdir "/home/$(whoami)/Desktop/backups" 

    while read extension 
    do 
     cd "/home/$(whoami)/Desktop/backups" 
     rm -rf "$extension" 
     mkdir "$extension" 
     cd "/media/FlashDisk/AhmetsFiles" 
     files=(`ls | grep -i "$extension"`) 
     fCount=(`ls | grep -c -i "$extension"`) 
     for ((i=0 ; $i<$fCount ; i++)) 
     do 
      cp -f "/media/FlashDisk/AhmetsFiles/${files[$i]}" "/home/$(whoami)/Desktop/backups/$extension" 
     done 
     let count++ 
    done 

    exec 0<&3 

    exit 0 
+1

而不是'/ home/$(whoami)'最好使用'$ HOME'。即使homedir位於不尋常的位置,它也可以工作。 – Thomas

+0

或者'〜/ Desktop'或者其他的。 –

+0

謝謝你的詳細信息托馬斯我會改變我的代碼。請幫助我,如果你知道如何在grep搜索中忽略空格:) –

回答

2

你的循環是遠遠複雜得多,它需要的,不需要任何lsgrepfilesfCount變量:

for file in *.$extension 
    do 
     cp -f "/media/FlashDisk/AhmetsFiles/$file" "$HOME/Desktop/backups/$extension" 
    done 

這適用於空格。

我假設你真的想將$extension解釋爲文件擴展名,而不是像原始代碼那樣在文件名中間有一些隨機字符串。

+1

它可以更簡單:'cp -f -t目標源文件/*.$擴展名' –

+0

非常感謝你:)托馬斯:)它的工作,但我不知道怎麼樣 ?我不明白它是如何工作的? –

+0

'* .whatever'只是擴展到匹配該模式的文件列表,但正確處理空格。 'for'循環遍歷它。 for循環的使用可能比C類算術版本更常見。見例如http://www.cyberciti.biz/faq/bash-loop-over-file/ – Thomas

1

你爲什麼不

grep -i "$extension" | while IFS=: read x ; do 
    cp .. 
done 

呢?另外,我相信你可能更喜歡像grep -i ".$extension$"這樣的東西(將它錨定到行尾)。

在另一方面,最優化的方式恐怕是

cp -f /media/FlashDisk/AhmetsFiles/*.$extension "$HOME/Desktop/backups/$extension/"