特定の拡張子を持つファイルを繰り返します。 (すべての拡張子がない可能性があります。)

特定の拡張子を持つファイルを繰り返します。 (すべての拡張子がない可能性があります。)

特定の拡張子を持つファイルを繰り返し、解析されたファイル名(拡張子なし)で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を使用する必要があります。failglobnullglobfailglobshopt -u failglobnullglob

関連情報