myarrayという配列を持つBashスクリプトがあります。
配列には4つのファイルの完全なファイル位置パスが含まれています。
私が望むのは、ファイル作成日ごとに配列要素をソートすることです。
簡単な例として、配列に次の4つのファイルがある場合:
/tmp/file1.txt (in index 0)
/tmp/test/file1.txt (in index 1)
/tmp/test1/file1.txt (in index 2)
/tmp/test2/file1.txt (in index 3)
...インデックス2のファイルは他のファイルよりも生成日が最新であるため、インデックス1でソートする必要があります。
私は最初に次のこのトリックを実行すると思いました。
myarray=($(for each in ${myarray[@]}; do echo $each; done | sort -n))
しかし、配列の内容を見ると、インデックス0に最新のファイルが表示されません。
bashでこれを達成する方法を知っている人はいますか?
ベストアンサー1
以下は、スクリプトをテストしているシステムが作成日をサポートしていないため、変更日ごとにファイルをソートします。サポートされている場合、交換は作成時間を出力する必要があり%Y
ます。%W
#! /bin/bash
files=(*.txt)
while IFS= read -r line ; do
sorted+=("$line")
done < <(
for f in "${files[@]}" ; do
echo $(stat -c %Y -- "$f")$'\t'"$f"
done | sort -nk1,1 | cut -t $'\t' -f2-
)
echo "${sorted[@]}"
名前にスペースが含まれているファイルに対して機能します。改行文字を含むファイル名は問題を引き起こす可能性がありますが、ファイル名に改行文字を使用しないでください。そうですか?