2015-01-08 19 views
1

比方說,我有一個文件夾,其文件名的格式爲foo<number1>.bar.o<number2><number1>可以由1,23數字組成。在某個點移動名稱中有一個或兩個數字的文件

現在,如果我,一些奇怪的原因,將要移動只在其中<number1>12數字的文件,而不是3,我會寫一個python腳本:

#!/bin/python 
import glob, shutil, re 
for f in glob.glob("*.bar.o*"): 
    print f 
    numbers = map(int, re.findall('\d+', f)) 
    print numbers 
    if numbers[0] < 100: 
     shutil.move(f, "dir/" + f) 

問題現在:如果這可以用較少的代碼完成,例如一行(最多80個字符),怎麼辦?

希望可用於bash shell的解決方案。

+0

你有沒有試過你自己打這個?如果是這樣,你卡在哪裏? –

+0

@TomFenech在'bash'部分,真的。我的問題更多地基於對其他解決方案的興趣,因爲我知道我花了大約10分鐘的代碼遠遠不是最優的。我現在看到這個缺陷,它不是一個真正的問題,或者意味着一個問題,但我仍然感興趣。 –

回答

1

,除非我弄錯了你的意思:

mv foo[0-9][0-9].bar* /wherever/you/like 

會趕上2個位數

對於任何一個你可以這樣做:

mv $(ls |egrep "foo[0-9]{1,2}.bar") /wherever/you/like 
+1

您可以嘗試使用'{0..99}'來捕獲所有的一位數字和兩位數字,而不是'[0-9] [0-9]'。 – hgazibara

+0

哎呀,是啊,只會抓住2位數字,而不是1 –

+0

@hgazibara雖然它的工作原理,它也會給出錯誤,如果某些數字在該範圍內無法找到... –

0

要匹配foo<number1>.bar.o<number2>

for filename in *.bar.o*; do 

    # 1. with a shell regex 
    [[ $filename =~ ^foo[[:digit:]]{1,2}\.bar\.o[[:digit:]]+$ ]] && echo $filename 

    # 2. with expanded globbing: shopt -s extglob 
    [[ $filename == foo[[:digit:]]?([[:digit:]]).bar.o+([[:digit:]]) ]] && echo $filename 

done 
相關問題