2014-01-30 67 views
0

比方說,我有一些名爲file1,file2,file3等的文件。我試圖找到一種方法來匹配前N個文件,在一個Bash腳本中,其中N是一個變量。這是到目前爲止,我考慮的選擇:在Bash腳本中匹配變量結尾的文件名範圍

  • 括號擴展,即file{1..3},不允許變量結束。換句話說,file{1..$N}不起作用。

  • 範圍表達式可用於匹配數字字符。它允許變量結束,即file[1-$N],但這隻適用直到N> 9.

  • $(seq 1 $N)可用於創建數字序列,但它並沒有幫助,因爲這個問題是匹配的數字序列一個文件名。如果文件名稱只是1,2,3等,這將起作用。

回答

1

這是另一種解決方案。我不主張這樣做,但是再次可以有合理的用途eval;)...我認爲不能在一個範圍內使用變量是一個令人討厭的/不那麼直觀的缺點。

N=5 
eval echo {1..$N} 

所以,你可以做

eval ls file{1..$N} 
+0

謝謝!這看起來像一個更優雅的解決方案。 –

0

我找到了一個使用擴展球的解決方案。他們需要啓用shopt -s extglob命令。 @(...)可用於匹配由|分隔的一組模式中的任何一個字符,例如[email protected](1|2|3)。現在我只需要用|生成數字序列作爲分隔符而不是換行符:

shopt -s extglob 
range=$(seq 1 $N) 
ls [email protected](${range//$'\n'/|}) 
+0

如果你的版本支持它,'seq -s'|' 1 $ N'將提供一個由管道分隔的數字串,讓您只需使用'file @($ range)'作爲模式。 – chepner

+0

感謝您的提示! –

0

你能簡單地做,

for file01.txt, file02.txt, file345.txt, file678.txt... 

cat file*.txt > file_all.txt 

還是我錯過了點?

+0

它看起來像提問者希望能夠停止在一些任意數量的匹配,'file * .txt'將匹配每個文件。 –