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

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

ディレクトリファイルを並べ替えたり、配列に保存する方法に多くの回答がありました。

ソートの例

ls -t 

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

array=(*)

私の特定の問題は、ファイルを特定の方法でソートする必要があります。拡大する(たとえば*.sh、変更日時に基づいてソートされたすべてのファイルを配列に保存して、後でファイルを編集または削除するときに使用できます。

たとえば、配列内のファイルをソートした後に次のコマンドを実行すると、最新のファイルを削除できます。

rm ${array[0]} 

答え1

存在する扱いにくいこれはとても簡単です。

array=(*.sh(Nom))

これグローバル予選 om修正時間に基づいて一致をソートし(最新の項目から)、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]}"

答え2

これを強力に行うには、ls次のことが必要です。いいえパス区切り文字を除くすべての項目を分割します。これがまさにその用途です。

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

これは現在のディレクトリ内のドット以外のすべてのファイルをソートし、結果をシェル配列に保存します$@。 POSIX が与えられると、lsこれはどんな種類のファイル名の変更にも影響を受けません。さまざまな特殊文字(改行文字を含む)が区切られた結果に保存されます。すべて(しかし最後に)ただし、.名前には追加ポイントが追加されます。結果をより永続的な配列に配置するには、タスクを一緒に処理できます。たとえば、次のようになります。

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

他の人があなたに何の言葉もないブログをリンクしても、できるls何を見つけるべきかを知ることで、結果を強力に処理できます。

関連情報