web-dev-qa-db-ja.com

以前の検索結果を持つUnix Tarコマンド

4つのファイルがあるとします。

a.Zip created on 28 feb 2018
b.Zip created on 28 feb 2018
c.Zip created on 2 mar 2018
d.Zip created on 2 mar 2018

2月28日のファイルを検索して、それをTarしたい。

find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -

しかし、それは機能していません。

4

GNUまたはFreeBSD findおよびGNUまたはBSD tar

find . -type f -newermt 2018-02-28 ! -newermt 2018-03-01 -print0 |
  tar -cf file.tar --null -T -

(それは正確にナノ秒2018-02-28T00:00:00.000000000で最後に変更されたファイルを除外することに注意してください(そして翌日の時間にファイルを含めることができます)ナノ秒の粒度を持つファイルシステムではほとんど発生しない限りファイルはtouch -t/touch -dで作成されたか、タイムスタンプを1秒未満の精度で保存しないアーカイブから抽出されたものです)

POSIXlyで、ファイル名に改行文字が含まれていないことを前提としています(標準のtarアーカイブ形式でもファイル名に追加の制限があります)。

touch -d 2018-02-28T00:00:00 .start
touch -d 2018-03-01T00:00:00 .end
find . -type f -newer .start ! -newer .end ! -path ./.start ! -path ./.end |
  pax -x ustar -w > file.tar

GNU tools:

find . -type f -printf '%Tm-%Td-%p\0' |
  sed -nz 's/^02-28-//p' |
  tar -cf file.tar --null -T -

find -lsの出力は、自動的に確実に後処理することはできず、人間が使用することのみを目的としています。

11

starを使用すると、コマンドラインは次のようになります。

touch -t201802280000 ref
star -c -f file.tar -find . -newer ref

ところで:-newermtはlibfindの将来の機能拡張になるかもしれません。

終了日もご希望の場合:

touch -t201802280000 start
touch -t201802282359.59 end
star -c -f file.tar -V pat='start!end' -find . -newer start ! -newer end

1秒を省略する必要があるか、またはうるう年の場合は2日を取得する可能性があることに注意してください。

2018年はうるう年ではないため、touch -t201803010000 end

4
schily

コマンドが機能しない理由を追加したいだけです

find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -

Findの出力は、ファイル名と日付などの他の情報のリストです。 Grepは、一致する日付の完全な行を出力します。 Tarはファイルの名前だけを期待し、改行ではなくnullバイトで区切られていることを期待します。

3
RalfFriedl

findにはdateオプションがあります。それらを試しましたか?

-newermt最終変更日

-newerat最終アクセス日

-権限が変更された最新の日付

例えば: find . -newermt 2018-07-10 ! -newermt 2018-7-11 | xargs tar -cfv file.tar[〜#〜] edit [〜#〜]as Charles Duffy コメント、この問題を回避するには:find . -newermt 2018-07-10 ! -newermt 2018-7-11 -print0 | xargs -0 tar -cfv file.tar

3
Hossein Vatani