「ファイル入力」はアルファベット順ではなく数字で構成されていますか? [コピー]

「ファイル入力」はアルファベット順ではなく数字で構成されていますか? [コピー]

フォルダ内の各ファイルに基づいてインデックスを作成するスクリプトがあります。すべてのファイル名は拡張子を含む数字です。

数値順に処理するようにループを変更するにはどうすればよいですか?

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

おすすめ記事