次の形式のファイルがあります。
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"