2017-04-07 1 views
1

にファイル名の特定の部分を抽出し、私は、フォルダ内の多くのファイルを持っている:バッシュ

yyyymmdd_hhmmss.mp4 
yyyymmdd_hhmmss_suffix1.mp4 
yyyymmdd_hhmmss_suffix1_suffix2.mp4 

次のファイル名の形式は、(まれ)も可能です:$は数0-ある

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"をキャッチして引数として使用しようとしています。

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

バッシュが組み込まれている正規表現のサポート、あなたは形式を確認したい場合:

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 

...または、最後の2つのアンダースコアを削除すると、それらの後にすべてのもの:

prefix=${file%_*_*} 

参照:

+0

ご協力いただきありがとうございます。私は先に進み、プレフィックスを取るつもりだと思う。しかし、anyname_suffix1_suffix2.mp4のために動作するコードを書く方法があるのだろうかと思います。 – AndriusWild

+0

あなたは実際にどのようなロジックを望んでいますか?最後から '_ * _ *'を殺すだけですか? 'prefix = $ {file%_ * _ *}'となります。 –

+0

接頭辞= $ {file%_ * _ *}は華麗で、まさに私が欲しいものです! @Charles Duffyありがとうございました – AndriusWild