名前の順序と一致するように、ディレクトリ内のファイルの変更日をどのように変更しますか?

名前の順序と一致するように、ディレクトリ内のファイルの変更日をどのように変更しますか?

これは自分で答えた質問なので、他の人も役に立つと思います。

Dolphinでは、名前による並べ替えと変更された日付による並べ替えを切り替えることがあります。しかし、Dolphinは私がいるフォルダの順序だけを変更するわけではないので、これは面倒です。それはすべてを変えます。そのため、ドルフィンで名前と日付を切り替えるときに特定のディレクトリが影響を受けないように、変更された日付を名前の順序に合わせて変更する方法がわかります。

答え1

それは非常に簡単であることが判明しました。

for FILE in *; do touch -- "$FILE"; sleep 0.001; done # sort

再帰的に実行するには:

for FILE in **/*; do touch -- "$FILE"; sleep 0.001; done # sort

これは# sort単なるコメントです。目的は、コマンドを逆に検索するのを容易にすることです。

答え2

あなたの方法(特にsleep 0.001通話前の通貨を追加)は、1秒未満の精度を持つタイムスタンプを持つシステムとファイルシステムでのみ機能しますが、ext4ファイルシステムを含むLinuxなどの一部のシステムおよびファイルシステムでは、タイムスタンプにナノ秒の解像度がある場合でも、これらのファイル配置には同じ精度タイムがあります。スタンプ(参照linux:タッチ日付精度そしてLinuxのファイルシステム時間が常にシステム時間より数ミリ秒遅いのはなぜですか?詳細はこちら)。

今後:

for f ({1..20}) touch $f
$ ls --full-time -lrt
total 0
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.183520078 +0100 2
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.183520078 +0100 1
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.187520223 +0100 3
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.191520368 +0100 6
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.191520368 +0100 5
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.191520368 +0100 4
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.195520512 +0100 8
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.195520512 +0100 7
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.199520657 +0100 9
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.199520657 +0100 10
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.203520802 +0100 13
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.203520802 +0100 12
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.203520802 +0100 11
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.207520947 +0100 15
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.207520947 +0100 14
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.211521092 +0100 17
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.211521092 +0100 16
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.215521237 +0100 19
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.215521237 +0100 18
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.219521381 +0100 20

(上記のタイムスタンプに示すようにsleep 0.001役に立たない可能性がありますtouch。私のシステムで実行するのに1ms以上かかりました。)

より良い点はtouch -d '0.000000001 second ago'(GNU仮定touch):

$ strace -qqe /utime touch -d now a
utimensat(0, NULL, NULL, 0)             = 0
$ strace -qqe /utime touch -d '0.000000001 second ago' a
utimensat(0, NULL, [{tv_sec=1687765504, tv_nsec=213757695} /* 2023-06-26T08:45:04.213757695+0100 */, {tv_sec=1687765504, tv_nsec=213757695} /* 2023-06-26T08:45:04.213757695+0100 */], 0) = 0

明示的なタイムスタンプが要求される場合、touchこれはシステムが現在キャッシュされているfs時間を選択するのではなく、システムへのフル精度クロック時間要求を使用して計算されるため、2つの後続の呼び出しが異なるタイムスタンプを取得することがほぼ保証されます。タイムスタンプが1秒未満の精度をサポートしていない場合は、まだ機能しません。

zshを使用してtouchGNUと互換性がある場合は、次のことができます。

zmodload zsh/datetime
now=$EPOCHSECONDS
for file ( *(NOn) ) touch -d @$((now--)) -- $file

または標準を使用してくださいtouch

zmodload zsh/datetime
now=$EPOCHSECONDS
for file ( *(NOn) ) {
  TZ=UTC0 strftime -s t %Y%m%d%H%M.%S $((now--)) &&
    TZ=UTC0 touch -t $t -- $file
}

$EPOCHSECONDS現在、Unixの時代はどこにありますか?*(NOn)同様*ですが、NULLLGLOBが有効になっており、ファイルが逆方向(大文字のO逆方向)Oにソートされているため。その後、タイムスタンプを1秒間隔に設定して時間をさかのぼります。nls -r

答え3

他の人がすでに言ったように、lsこの(echo) *順序は異なります。

lsソート(またはls -[some option]ソート)が必要な場合は、ls -r単に代わりにこれを使用できます*

さらに、「*」は(大きなディレクトリで)結果のコマンドラインが行の長さ制限を超える可能性があるすべてのファイル名のリストに展開されるため、本質的に安全ではありません。シェル(シェル、バージョンによって異なります)は、「コマンドラインが長すぎます」などのエラーで応答します。

最後に一つ言うと、シェル変数名を大文字に指定しないのが安全な習慣です。システム変数(たとえば、「PATH」、「SHELL」、「OPTARG」など)は通常大文字で表示され、独自の変数名を同じ方法で指定すると、その変数を設定(解除)する危険があります。独自のスクリプトに混在(または小文字)の大文字と小文字を使用すると安全です。

ls |\
while read fFile ; do
     touch fFile
done

関連情報