ディレクトリ内のフォルダから最も古いファイルを選択する方法[重複]

ディレクトリ内のフォルダから最も古いファイルを選択する方法[重複]

私のディレクトリにはnたくさんのファイルがあります../in/。これらのファイルの中で最も古いファイルを処理してその../complete/ディレクトリに送信したいと思います。残りのファイルはこの../error/ディレクトリに転送されます。誰でも助けることができますか?

ベストアンサー1

最も古いファイルをコピーするには../complete:

cp -v "$(find ../in -maxdepth 1 -type f -printf '%T@ %p\0' | sort -zn | \
  sed -zn '1s/[0-9,\.]\+ //p')" ../complete

最も古いものを除くすべてをコピーするには、次の手順を実行します../error

find ../in -maxdepth 1 -type f -printf '%T@ %p\0' | sort -zn | \
  sed -zn '2,$s/[0-9,\.]\+ //p' | xargs -0 cp -vt ../error

説明する:

  • find
    • -maxdepth 11つのレベルだけが下がるので、ディレクトリを繰り返し検索しません。
    • -type fファイルのみが一致します。
    • -printf '...'カスタム出力形式。%T@ファイルの最後の変更時刻(タイムスタンプ)を提供し、%pファイル名。\0最後まで注意してください。ファイルは改行ではなくヌルバイトで区切られて印刷されます。これは、改行がファイル名の文字である可能性があるため、コマンドが中断される可能性があるためです。
  • sort -znその後、ヌルバイトで区切られた出力を読み取り()、-z数字でソートします(-n)。
  • sed -znヌルバイトで区切られた出力を読み取ります。
    • 1最初の行(最初のコマンド)のみが一致し、2,$他のすべての行(2番目のコマンド)と一致します。
    • s/[0-9,\.]\+ //p先行タイムスタンプが出力から削除されます。
  • 2番目のコマンドのみ:xargs -0 cp -vt ../errorヌルバイトで区切られた()出力を処理し、-0ファイルcp -vt ../errorをコピーするすべての入力を呼び出します。

出力例:

$ ls -lt ../in/
total 0
-rw-r--r-- 1 user user 0 Jun 24 08:18 file2
-rw-r--r-- 1 user user 0 Jun 24 08:18 file3
-rw-r--r-- 1 user user 0 Jun 24 08:18 file4
-rw-r--r-- 1 user user 0 Jun 24 08:18 file5
-rw-r--r-- 1 user user 0 Jun 24 08:17 file_oldest
$ cp -v "$(...)" ../complete
'../in/file_oldest' -> '../complete/file_oldest'
$
$ find ... | xargs ... ../error
'../in/file2' -> '../error/file2'
'../in/file3' -> '../error/file3'
'../in/file4' -> '../error/file4'
'../in/file5' -> '../error/file5'

おすすめ記事