変更された日付でファイルを並べ替え、名前で並べ替えます。

変更された日付でファイルを並べ替え、名前で並べ替えます。

さまざまなカメラの画像を含むディレクトリを考えてみましょう。

DCIM1234.JPG
DCIM1235.JPG
DCIM1236.JPG

DSCN4120.JPG
DSCN4121.JPG
DSCN4122.JPG
DSCN4123.JPG

IMG5840.JPG
IMG5841.JPG
IMG5842.JPG
IMG5843.JPG

これらの個々のカメラのすべてのファイルは、を使用して変更日ごとに簡単に並べ替えることができますls -t。問題は、ほとんどのファイルシステムの精度が1秒以上であるため、連続撮影時と同様に、一部の写真のタイムスタンプが同じであることです。この場合、ls -tファイルの自然な順序が失われ、名前に反映される可能性があります。

変更時間ごとにファイルを並べ替えると同時に、変更時間が同じファイルを名前で並べ替えるには?

答え1

ls通常、出力を解析しないことをお勧めします。上記のdidal24で提案したように、statより良いオプションです。

$ stat -c "%Y/%n" *.JPG | sort -t/ -k1,1n -k2 | sed 's@^.*/@@'

からman stat

ファイルの有効なフォーマット順序(--file-systemを除く):
...
%n filename
%Y最後のデータ変更時刻、エポック以降

したがって、stat -c "%Y/%n" *.JPG秒単位のタイムスタンプで始まる各ファイルの名前が提供されます/

1580845717/IMG5841.JPG

このコマンドの出力はにパイプされ、sort -t/ -k1,1n -k2最初の列に基づいてソートされ、次に数字(タイムスタンプ)、2番目の列に基づいてソートされます。列は/()で区切られています-t/

最後に、コマンドの出力sortがにパイプされ、sed最初の文字(選択された区切り文字)まですべての文字が削除されます。/結果は、目的の順序(最後にリストされている「最新」ファイル)でファイル名のリストに表示されます。

答え2

sortフォーマットされた日付出力と組み合わせたこのコマンドを参照してくださいls。次のようなものが良い出発点になります。

TIME_STYLE=+%s ls -l | sort -k6,6n -k7 | awk '{print $7}'

ls -lこの出力に基づいて:

-rw-rw-r--. 1 ajc ajc  669 1626129161 commit-types.txt
-rw-r--r--  1 ajc ajc 3578 1638037524 emacsintro.org
-rw-r--r--  1 ajc ajc  170 1646399639 README.md

コマンドの各部分の説明:

  1. TIME_STYLE形式の日付列ls -l。この例では、Unix epochスタイルの出力を使用しています。+%s
  2. sort -k6,6n -k7。デフォルトのアルファベット順方法を使用して、数値に基づいて6列に基づいて出力をソートし、ls -l7列に基づいてソートします。
  3. awk '{print $7}'。列7のみが表示されます。これは、6列を表示したい場合に必要ですawk '{print $6 $7}'

これは文書の並べ替えそしてファイルタイムスタンプ文書

関連情報