2017-01-15 27 views
0

我有一個文件夾中的多個文件的數量和他們的文件名包含字母數字值。對於例如045_gfds.sql,46kkkk.sql,47asdf.sql等我想比較這些文件名中的數字與變量中存儲的另一個數字可以說$ x = 45並找出文件名中包含的數字大於數字的文件。我正在使用Cygwin,目前只能使用egrep命令檢索數字。例如,如何比較數字與BASH中的文件名

filename="C:\scripts" 
dir $filename | egrep -o [0-9]+ 

輸出爲:045 46 47

我想所有的文件名作爲比較大於$ = 45後的文件名輸出:

46kkkk.sql 
47asdf.sql 

需要使用正則表達式幫助比較更大比文件名中的值。

+1

這看起來像是一個關於[Unix&Linux Stack Exchange](http://unix.stackexchange.com/)的問題。但也許不是。我建議你解釋**你想達到什麼樣的目標,而不是**你想達到的目標。可能有更好的解決方案。在這裏閱讀:[XY問題](http://xyproblem.info/)。 – giusti

+0

感謝giusti,我想輸出作爲文件名,其中包含大於$ x = 45的文件名中的數字。請讓我知道是否需要更多信息來澄清我的問題 –

回答

0
#!/bin/bash 

dir="$1" 

print_if_greater="45" 

for fname in "$dir"/[0-9]*; do 
    num="${fname##*/}"  # isolate filename from path 
    num="${num%%[^0-9]*}" # extract leading digits from filename 

    if ((num > print_if_greater)); then 
     printf '%s\n' "$fname" 
    fi 
done 

上述腳本將遍歷給定目錄中以至少一個數字開頭的所有文件。

從路徑中剝離文件名,並使用bash的變量擴展語法提取文件名中的最初數字。

如果提取的數字大於$print_if_greater,則標準輸出中將顯示完整的路徑名。

調用該腳本與您想檢查目錄:

$ ./thescript.sh 'C:\scripts' 

$ bash ./thescript.sh 'C:\scripts' 

我沒有訪問Cygwin的,所以我一直沒能用窗口式路徑測試它。如果上述不起作用,請嘗試使用C:/scripts作爲路徑。

+0

謝謝Kusalananda !!!它的工作非常好。我現在面臨的唯一問題是它不考慮文件名。 (點)後的數字。例如,比較後,結果中不會顯示像'69 .hghgg.sql'這樣的文件名。 –

+0

@JayeshSangle嗯...它爲我做。我甚至安裝了Cygwin並進行了測試。該文件的文件名開頭是否有空格? – Kusalananda

0

你可以試試這個:

DIR="C:\scripts" 
MAX=45 
for FILE in "$DIR"/* 
do 
    if 
    [[ "$FILE" =~ ^([0-9]+) ]] 
    then 
    NUMBER="${BASH_REMATCH[1]}" 
    if 
     [ "$NUMBER" -gt "$MAX" ] 
    then 
     echo "$FILE" 
    fi 
    fi 
done 

請注意,我還沒有測試此代碼。它是特定於bash的,並假定數字始終位於文件名的開頭。