特定の拡張子を持つファイルを繰り返し、解析されたファイル名(拡張子なし)でXMLファイルを生成する簡単なスクリプトがあります。ただし、ディレクトリに拡張子がない場合は* .extが生成され、結果がめちゃくちゃになります。 *.wlensのような名前ではなく、実際のファイルの名前だけを取得するにはどうすればよいですか?
PSファイル名に「.」を含めることができるので、より複雑な名前解決を行っています。これを行うより効率的な方法がある場合は、コメントありがとうございます。
#!/bin/bash
echo "
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
" > retrieve_xmd_build_package.xml
for i in *.{wdash,wcomp,wlens};
do
echo "<members>" >> retrieve_xmd_build_package.xml
echo " " "$i"| sed 's#^\(.*\)\.\(.*\)#\1#' >> retrieve_xmd_build_package.xml
echo "</members>" >> retrieve_xmd_build_package.xml
done
echo "<name>WaveXMD</name>" >> retrieve_xmd_build_package.xml
echo "
</types>
<version>56.0</version>
</Package>
" >> retrieve_xmd_build_package.xml
いずれかの拡張子を誤って入力した結果は次のとおりです。
<?xml version=1.0 encoding=UTF-8?>
<Package xmlns=http://soap.sforce.com/2006/04/metadata>
<types>
<members>
weekday DASH
</members>
<members>
*
</members>
<members>
weekday LENS 2
</members>
<members>
weekday LENS
</members>
<name>WaveXMD</name>
</types>
<version>56.0</version>
</Package>
答え1
個人的には私を使用することを好みますfind
が、bashでoptionsを設定することでこれを行うことができますnullglob
。つまり、ループの前のどこかに追加しますfor
。
shopt -s nullglob
からman bash
:
nullglob
設定されている場合、bashは、どのファイルとも一致しないパターン(上記のパス名の拡張を参照)を、自分ではなく空の文字列に拡張することを許可します。
たとえば、nullglob
設定と設定解除の違いを比較します。まず、設定を解除します(.bashrcまたは他の設定ファイルスクリプトで設定しない限り、通常はデフォルト)。
$ shopt -u nullglob
$ for i in *.{wdash,wcomp,wlens}; do echo "$i"; done
*.wdash
*.wcomp
*.wlens
これらのファイルglobは現在のディレクトリに存在しないため、設定を解除するnullglob
と、bashは一致しないglobを独自に拡張します(つまり、globをリテラル文字列として使用します)。
次にnullglobを設定します。
$ shopt -s nullglob
$ for i in *.{wdash,wcomp,wlens}; do echo "$i"; done
つまり、nullglob 設定は、一致しない glob がそれ自体で拡張されるのを防ぐので、for ループは何も印刷しません。
Bashではこのfailglob
オプションが優先されますので、設定してnullglob
も効果はありません。設定されている場合、それを使用するにはUnsetを使用する必要があります。failglob
nullglob
failglob
shopt -u failglob
nullglob