web-dev-qa-db-ja.com

特定の拡張子を持つファイルを変更された時間で並べ替え、配列に保存します

ディレクトリのファイルを並べ替えたり、配列に保存したりするための多くの答えを見つけました。

ソート例

ls -t 

配列内のディレクトリリスト

array=(*)

私の特定の問題は、特定の拡張子(たとえば*.sh)変更日時に基づいて、これらのソートされたすべてのファイルを配列に保存し、後でファイルの編集または削除に使用できるようにします。

たとえば、配列に並べ替えられたファイルを配置した後、次のコマンドを実行して最新のファイルを削除できます。

rm ${array[0]} 
3
Osaid

zsh ではそれは同じくらい簡単です

array=(*.sh(Nom))

glob qualifieromにより、一致は変更時刻(最新のものから)でソートされ、Nは、一致がない場合(代わりに)配列を強制的に空にします。エラーの原因となる)。

Bashなどの他のシェルでは、時間で並べ替える良い方法はありません。 ls -tを使用できますが、出力があいまいなため、機能しなくなる可能性があります。ファイル名にlsが印刷可能と見なす文字のみが含まれていて、空白または\[*?でないことがわかっている場合は、次のコマンド置換を使用できます。

array=($(ls -t -- *.sh 2>/dev/null))

ワイルドカード文字と水平方向の空白を保護することでこれをより堅牢にすることができますが、改行と印刷できない文字は依然として問題です。

IFS=$'\n'; set -f
array=($(ls -t -- *.sh 2>/dev/null))
unset IFS; set +f

Zshを除いて、変数の値を参照するときは二重引用符を忘れないでください。また、名前がダッシュで始まり、オプションとして解釈されるファイルを保護するために--を忘れないでください。 rm -- "${array[0]}"

lsでこれを確実に行うには、notパス区切り文字以外で分割する必要があります-それが目的です。

IFS=/; set -f
set -- $(ls -dt ./*)
shift

これにより、現在のディレクトリ内のすべての非ドットファイルが並べ替えられ、結果がシェル配列$@に配置されます。 POSIX lsが与えられた場合、これはファイル名のマングリングの影響を受けません。改行を含むすべての種類の特殊文字が区切られた結果に残ります。それぞれ(ただし最後)ただし、名前に.ドットが追加されます。結果をより永続的な配列に入れたい場合は、次のようにジョブをまとめて処理できます。

a=()
until [ -z "$2" ] &&
      a+="$1" && shift
do    a+="${1%?}"
shift;done

他の人があなたをリンクしているかもしれないどんな種類のナンセンスなブログに関係なく、あなたはcan何を探すべきかを知っていれば、lsの結果をしっかりと処理します。

1
mikeserv