フォルダ内の各ファイルに基づいてインデックスを作成するスクリプトがあります。すべてのファイル名は拡張子を含む数字です。
数値順に処理するようにループを変更するにはどうすればよいですか?
for file in xml/*.xml; do
...
done
ベストアンサー1
GNU sort
区切り文字を区切るオプションがある場合は、\0
これを実行できます。これにより、while
ループが処理できるようにファイルが並べ替えられた順序でインポートされ始めます。printf
このオプションをカスタムロジックに置き換えます。
shopt -s nullglob
printf '%s\0' xml/*.xml | sort -zV | while read -rd '' file; do
printf "%s\n" "$file"
done
shopt -u nullglob
このオプションは、現在のフォルダにファイルが見つからない場合にnullglob
シェルが空のグローブを拡張するのを防ぐためです。処理が完了すると、xml
このオプションは設定解除されます。-u
〜のようにトニースペートシェルオプションを混乱させたくない場合(たとえば、他の理由でアクティブになる可能性がある場合)、これをサブシェルに設定してグローバル拡張が行われるようにします。
( shopt -s nullglob; printf '%s\0' xml/*.xml ) | sort -zV | while read -rd '' file; do
printf "%s\n" "$file"
done