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

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

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

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"

答え2

この試み

$ ls -1
x.sh
XXX XXXX XXX-6VwvOkZvzuI.description
YYY XXXX XXX-6VwvOkZvzuI.description
$ cat x.sh
#!/bin/bash
for file in *.d*
do
 fname=${file/-*/}
 ext=${file/*-/}
 echo fname $fname ext $ext
done
$ ./x.sh
fname XXX XXXX XXX ext 6VwvOkZvzuI.description
fname YYY XXXX XXX ext 6VwvOkZvzuI.description
$

答え3

編集する

私の答えは維持しますが、@Kusalanandaの答えに警告を追加します。解析しないでくださいls(例: なぜ`ls`を解析しないのですか*(そしてどうすればいいですか?))。

私の答え

lsの出力をsedに直接パイプし、-ハイフン()の前の部分のみを変更できます。

ls *.d* | sed 's/\(.*\)-.*/\1/'

私は次の2つのファイルを試しました。

XXX XXXX XXX-6VwvOkZvzuI (copy).description
XXX XXXX XYZ-6VwvOkZvzuI.description

出力は次のとおりです

XXX XXXX XXX
XXX XXXX XYZ

sed コマンドは次のように動作します。

  • 上記でbetweenを使用したことを覚えています\(\)この場合、すべては次のようになります。最後ファイル名のハイフン(ファイル名の後にハイフンが含まれている場合は調整する必要があります)
  • それから覚えているものに変えてください\1。つまり、XXX部分のみ

必要に応じて、コマンド出力をファイルに入れることができます。

ls *.d* | sed 's/\(.*\)-.*/\1/' > new_file

関連情報