2017-05-07 56 views
0

我有一些將文件名中的日期轉換爲路徑的代碼。Shell(Bash)參數展開表達式

#!/bin/bash 
aFile="bla_2016-11-24_17-24.zip" # Many files, each with same format: "bla_{year}-{month}-{day}_{hour}-{minute}.zip" 
aDate=${aFile#*_} # remove "bla_" 
aDate=${aDate%.*} # remove ".zip" 
aDate=${aDate//_/ } # replace "_" with " " 
aDate=(${aDate//-/ }) # replace "-" with " " and make array 
aPath="${aDate[0]}/${aDate[1]}/${aDate[2]}/${aDate[3]}/${aDate[4]}" 
mkdir -p $aPath 

我看到這兩個(12),這表明,在bash腳本嵌套參數擴展表達式是不可能的。

我想知道是否有更好的方法來實現我的代碼上面,更具體地減少代碼的長度。這只是五行,所以如果不可能的話,不會有太大的刺激,但看起來我正在以一種愚蠢的方式去做。

Python的解決方案:

aFile = "bla_2016-11-24_17-24.zip" 

import re 
aPath = "/".join(re.split("[_-]", aFile[4:-4])) # 2016/11/24/17/24 
+0

隨着GNU sed的:'回聲​​ 「bla_2016-11-24_17-24.zip」 | sed -E'/^[^ _] + _(。*)\。zip $/\ 1 /; s | [_-] |/| g''輸出:'2016/11/24/17/24 '或用awk:'echo「bla_2016-11-24_17-24.zip」| awk -F'[_.-]''{OFS =「/」;打印2美元,3美元,4美元,5美元,6美元}' – Cyrus

+0

不錯的解決方案,我喜歡他們 – ratskin

回答

2

使用bash:

aFile="bla_2016-11-24_17-24.zip" 
[[ ${aFile//[_.-]//} =~ ^[^/]*/(.*)/[^/]*?$ ]] && echo "${BASH_REMATCH[1]}" 

輸出:

 
2016/11/24/17/24 
+0

我喜歡這個比@RicardoBranco因爲它沒有引用陣列5次 – ratskin

+0

我也喜歡它。不知道這個BASH_REMATCH特性。Upvote。 –

0

其實,我解決了這個。我嘗試了sed的解決方案,然後意識到這是愚蠢的;我可以使用我的Python解決方案。因此,對於任何人都知道,這裏是我的:

aFile="bla_2016-11-24_17-24.zip" 
aPath="$(python -c 'import sys, re; print "/".join(re.split("[_-]", sys.argv[1][4:-4]))' "$aFile")" # 2016/11/24/17/24 
1

這裏有一個更快的Bash解決方案:

aFile="bla_2016-11-24_17-24.zip" 
arr=($(echo ${aFile//[_-\.]/ })) 
aPath=${arr[1]}/${arr[2]}/${arr[3]}/${arr[4]}/${arr[5]} 

編輯:此解決方案僅與最新版本的Bash如一個附帶的Ubuntu 16.04(4.3工程。 46)。它以4.3.30失敗(由Debian 8發貨)。

+0

剛試過,沒有工作 – ratskin

+0

你確定嗎?我剛剛嘗試過它,它的工作原理... –

+0

https://pastebin.com/kPwqtvDT – ratskin