bashのファイル配列のリストを日付で並べ替え、パラメータ制限をバイパスします。

bashのファイル配列のリストを日付で並べ替え、パラメータ制限をバイパスします。

そのため、bashシェルにファイル配列のリストがあり、配列の最初のファイルである最も古いファイルから始めて、変更日ごとに配列内のすべてのファイルをソートしたいと思います。しかし、元の配列をソートして変更する代わりに、ソートされた結果が別の配列にあることを望みます。私は見たこのスレッド配列はファイルではなく変数なので修正しましたが、次のコマンドを試しました。

new_array=( $(ls -t $(printf '%s\n' "${array_list[@]}")) )

しかし、配列が大きすぎてlsが引数リストを「長すぎる」と報告します。

最も古いファイルから始めて、変更日ごとにデフォルトの配列を並べ替え、結果を別の配列に保存する別の方法はありますか?

ベストアンサー1

最新バージョンのGNUlsとGNUでは、bash次のことができます。

readarray -td '' new_array < <(
  ls --zero -dt -- "${array_list[@]}")

execve()ただし、これはパラメータ+環境長制限をバイパスしません。はいlsこのパラメータリストを使用して実行します。printf実行不可能な関数や組み込み関数にリストを渡すことで、引数の代わりにexecve()stdinからリストを読み取ることができるコマンドに渡すことができます。

最新バージョンのGNU find (およびGNUsortとGNU cut):

print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
readarray -td '' new_array < <(
  print0 "${array_list[@]}" |
    find -files0-from - -prune -printf '%T@\t%p\0' |
      sort -rzn |
      cut -zf2 -)

または、GNUを使用statして配列要素がないとします-

print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
readarray -td '' new_array < <(
  print0 "${array_list[@]}" |
    xargs -r0 stat --printf='%.Y\t%n\0' --
      sort -rzn |
      cut -zf2 -)

zsh組み込みのものがありますstat(GNU以前のバージョン)。したがって、ここで直接次のことができます。

zmodload zsh/stat
typeset -A mtime
stat -nLA mtime -F %s%9. +mtime -- $array_list
new_array=( /(Ne['reply=($array_list)']nOe['REPLY=$mtime[$REPLY]']) )

これは、ファイルを作成時にマッピングするための連想配列を構築し、$mtime A(数値用)glob修飾子を使用してリストをソートします。Oen

おすすめ記事