2012-10-22 56 views
6

我有文件創建從文件名的目錄和移動慶典

BR0200.aaa.tsv 
BR0200.bbb.tsv 
BR0200.ccc.tsv 
BR0210.aaa.tsv 
BR0210.bbb.tsv 
BR0210.ccc.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 

的負荷,我想創建一個基於文件名的第一部分到第一系列的目錄「」

BR0200 
BR210 
W0210 

,然後將相關文件移動到正確的目錄(即所有BR0200。*文件BR0200目錄)。

我有刺傷bash腳本,但我不斷收到錯誤。任何意見將受到感謝。

#!/bin/bash 

for file in BR* W0*; do 
dir = "${file%%.*}" 
if [-e $dir];then 
mv "$file" "$dir" 
else 
mkdir -p "$dir" 
mv "$file" "$dir" 
fi 
done 

對不起,如果這是一個基本問題。我試圖搜索網頁,但沒有結果。

+0

@owlstead你是什麼意思? –

+0

@owlstead globbing是shell必須提供的最有用的功能之一。 – jordanm

+0

@jordanm你是對的,當然,刪除評論。 –

回答

6

作業中=周圍不允許有空格。

dir="${file%%.*}" 

相反,空白是在測試所需

if [ -e $dir ]; then 
    ^ ^

至於風格的改進,它不會傷害做不必要的mkdir -p,這樣你就可以擺脫if聲明。

任務中不需要引號,因此您可以將其從dir=行中刪除。儘管引用是一個好主意,所以不要刪除其他引號。

在for循環中增加一個額外的.*可能會很好。這樣,如果您不止一次運行該腳本,它將不會嘗試移動這些新創建的子目錄。而一個巧妙的技巧(雖然不一定是改進)是將BR*.* W0*.*縮短爲{BR,W0}*.*

for file in {BR,W0}*.*; do 
    dir=${file%%.*} 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 
0

你可以嘗試這樣的事情:

在BR *文件WO *;不要 DIR = $(回聲$ {文件} |。awk的-F '{打印$ 1}' OFS =) 的mkdir $ DIR MV $文件$目錄 做

我也有類似的情況,這工作爲了我。

相關問題