ファイル名の一部を抽出しますか?

ファイル名の一部を抽出しますか?

次の形式のファイルがあります。

XXX XXXX XXX-6VwvOkZvzuI.description

ファイル名のみどのように取得できますかXXX XXXX XXX?私は試した:

for file in $(ls .d*)
do
    fname="${file%*-}"
    ext="${filename%.*}"
done

ベストアンサー1

解析しないでくださいls(例:なぜ`ls`を解析しないのですか*(そしてどうすればいいですか?))。問題は、ループ変数がfileすべて1つの長い文字列に連結された後にファイル名の値を取得してからスペースに分割することです(そして分割後)。ワイルドカードパターンには拡張子があります。 )。ファイル名ループは3回繰り返されますXXX XXXX XXX-6VwvOkZvzuI.description(例:valueXXXとloopのXXXX各々)XXX-6VwvOkZvzuI.description

名前にダッシュと.description使用されたファイル名のサフィックスを含むすべてのファイルを繰り返します。

for name in *-*.description; do ...; done

-で前の部分を選択するには、標準パラメータ拡張を使用して、文字列から最初の部分の後のすべての項目を$name削除します。-

prefix=${name%%-*}

%%usingとここでの違い%は次のとおりです。%%最長一致する末尾の文字列が削除されます。名前に複数の文字が含まれる場合、-これは重要です。

それからループは

for name in *-*.description; do
    prefix=${name%%-*}
done

.descriptionファイル名サフィックスは知られていますが、()を使用してファイル名ビットをサフィックスにインポートできます。-

infix=${name#"$prefix"}
infix=${infix%.description}

最後に、次のスクリプトを使用します。

#!/bin/sh

suffix=.description

for name in *-*"$suffix"; do
    prefix=${name%%-*}
    infix=${name#"$prefix"}
    infix=${infix%.description}

    printf 'prefix="%s", infix="%s", suffix="%s"\n' \
        "$prefix" "$infix" "$suffix"
done

あなたは得るでしょう

$ ls
XXX XXXX XXX-6VwvOkZvzuI.description          XXX XXXX XXX-6VwvOkZvzuK.description
XXX XXXX XXX-6VwvOkZvzuJ.description          script
$ ./script
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuI", suffix=".description"
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuJ", suffix=".description"
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuK", suffix=".description"

おすすめ記事