はい

はい

各ファイル名に同じ数の「-」区切り文字を含むファイルセットを並べ替えたい(数値の並べ替えには-nを使用)。

サンプルのリストは次のとおりです。

/home/flora/edvart/docs/schimmel-01.png
/home/flora/edvart/docs/schimmel-02.png
/home/flora/edvart/docs/schimmel-03.png
/home/flora/edvart/docs/schimmel-04.png
/home/flora/edvart/docs/schimmel-05.png
/home/flora/edvart/docs/schimmel-06.png
/home/flora/edvart/docs/schimmel-07.png
/home/flora/edvart/docs/schimmel-08.png
/home/flora/edvart/docs/schimmel-09.png
/home/flora/edvart/docs/schimmel-10.png
/home/flora/edvart/docs/schimmel-11.png
/home/flora/edvart/docs/schimmel-12.png
/home/flora/edvart/docs/schimmel-13.png

これは私が使用するコードです。

for fl in "$@"; do
   fnme=${fl##*/}
   ftyp=${fl##*.}

   fdir=${fl%/*}
   fnam=${fnme%.*}

   nf=$( echo "$fnam" | awk -F '-' '{print NF}')
   ifld=$(( nf + 1 ))

   find "$fdir" -type f -name "${fnam}-*.png" |
     awk -F'[-.]' '{print $(NF-1), $0}' RS='\0' ORS='\0' |
     sort -znt '-' -k "$ifld"n | 
   while IFS= read -r flimg
   do
     echo "$flimg"
   done
done

しかし、最初の3つのファイル-1、-2、-3を試してみると、結果はまだ数値順に並べ替えられません。

/home/flora/edvart/docs/schimmel-04.png
/home/flora/edvart/docs/schimmel-05.png
/home/flora/edvart/docs/schimmel-06.png
/home/flora/edvart/docs/schimmel-07.png
/home/flora/edvart/docs/schimmel-08.png
/home/flora/edvart/docs/schimmel-09.png
/home/flora/edvart/docs/schimmel-10.png
/home/flora/edvart/docs/schimmel-11.png
/home/flora/edvart/docs/schimmel-12.png
/home/flora/edvart/docs/schimmel-13.png
/home/flora/edvart/docs/schimmel-1.png
/home/flora/edvart/docs/schimmel-2.png
/home/flora/edvart/docs/schimmel-3.png

ベストアンサー1

シェルzshには、シェルオプションと呼ばれるシェルオプションがありますNUMERIC_GLOB_SORT。デフォルトでは、ワイルドカードパターンを数字で並べ替えます。

シェルでない場合zsh:

zsh -o NUMERIC_GLOB_SORT -c 'printf "%s\n" /home/flora/edvart/docs/*.png'

または、(n)glob修飾子を使用して特定のモードに対してのみこのシェルオプションを有効にします。

zsh -c 'printf "%s\n" /home/flora/edvart/docs/*.png(n)'

zsh -cまたは、スクリプトからパターンをハードコーディングする代わりに、パターンをパラメータとして渡します。パターンには引用符が必要です。

zsh -c 'printf "%s\n" ${~1}(n)' zsh '/home/flora/edvart/docs/*.png'

テスト:

$ ls -d *.png
schimmel-04.png   schimmel-08.png   schimmel-11.png   schimmel-3.png
schimmel-05.png   schimmel-09.png   schimmel-12.png
schimmel-06.png   schimmel-1.png    schimmel-13.png
schimmel-07.png   schimmel-10.png   schimmel-2.png
$ zsh -c 'printf "%s\n" ${~1}(n)' zsh '*.png'
schimmel-1.png
schimmel-2.png
schimmel-3.png
schimmel-04.png
schimmel-05.png
schimmel-06.png
schimmel-07.png
schimmel-08.png
schimmel-09.png
schimmel-10.png
schimmel-11.png
schimmel-12.png
schimmel-13.png

ディレクトリパスに数が多い場合は、ディレクトリパスの数が同じであれば動作し続けます。

おすすめ記事