そのため、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修飾子を使用してリストをソートします。Oe
n