2017-04-07 129 views
1

我有一個文件夾中的許多文件:提取文件名的某些部分猛砸

yyyymmdd_hhmmss.mp4 
yyyymmdd_hhmmss_suffix1.mp4 
yyyymmdd_hhmmss_suffix1_suffix2.mp4 

以下文件名格式也是可能的(很少):

yyyymmdd_hhmmss_$$$.mp4 
yyyymmdd_hhmmss_$$$_suffix1.mp4 
yyyymmdd_hhmmss_$$$_suffix1_suffix2.mp4 
yyyymmdd_hhmmss_$$.mp4 
yyyymmdd_hhmmss_$$_suffix1.mp4 
yyyymmdd_hhmmss_$$_suffix1_suffix2.mp4 
yyyymmdd_hhmmss_$.mp4 
yyyymmdd_hhmmss_$_suffix1.mp4 
yyyymmdd_hhmmss_$_suffix1_suffix2.mp4 

其中$是一個數字0〜 9

我試圖抓住「YYYYMMDD_HHMMSS」,並用它作爲參數。 這是我做什麼,當只有一個後綴提出:

for file in "[email protected]"; do 
    file_nosuffix="${file%*_suffix1.mp4}.mp4" 
    echo "$file and $file_nosuffix" 
done 

但是,當上面提到的文件名格式的種種都我迷路。 理想情況下,我想堅持目前的模式:

這可能嗎?

+0

你爲什麼不只是保存前15個字符到一個變量? – Kathara

+1

另外,默認情況下,'for file'遍歷'「$ @」'。 –

+0

此外,順便提一下,提供的測試數據實際上與您所陳述的格式相符,而不是用於人類的描述性內容,但不能用於實際測試。 'yyyymmdd_hhmmss'與預期所有這些字符都是數字的東西不匹配,例如,*可能是*您的實際格式。 –

回答

4

bash有內置的正則表達式的支持,如果您想確認的格式爲:

regex='^[[:digit:]]{8}_[[:digit:]]{6}' # POSIX ERE; can't use PCRE extensions here 

for file; do 
    if [[ $file =~ $regex ]]; then 
    echo "${BASH_REMATCH[0]} is the substring for $file" >&2 
    else 
    echo "$file does match the required format" >&2 
    fi 
done 

人們也可以採取平凡的前綴;

for file; do 
    prefix=${file:0:15} 
    echo "Prefix for $file is $prefix" 
done 

...或者,他們之後刪除最後兩個下劃線和一切:

prefix=${file%_*_*} 

參見:

+0

謝謝大家的幫助。我想我會繼續前進。但是,我想知道是否有一種方法可以編寫任何適用於anyname_suffix1_suffix2.mp4的代碼 – AndriusWild

+0

您真正想要什麼邏輯?最後殺死'_ * _ *'? 'prefix = $ {file%_ * _ *}',那麼。 –

+0

prefix = $ {file%_ * _ *}很棒,這正是我想要的!謝謝@Charles Duffy – AndriusWild