私のディレクトリには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 1
1つのレベルだけが下がるので、ディレクトリを繰り返し検索しません。-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'